单列索引与联合索引

一般在创建数据表的时候,就会根据表的业务属性,对查询比较频繁的字段建立索引,方便提高查询速度。如果该表存在多个字段查询频繁,是该建立多个单列索引还是创建一个多列联合索引呢?

索引

简单来说,索引就是一个指针,指向表里的数据。索引通常与相应的表时分开保存的,目的是提高检索的性能。索引的创建与删除不会影响数据本身,但会影响数据检索的速度。索引也会占据物理存储空间,可能比表本身还大,因此创建索引也要考虑存储空间。

索引类型

单列索引

如果某个字段经常在where子句作为单独的查询条件,它的单列索引最为有效。单列索引是最简单常见的索引,基于一个字段创建。

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME)
唯一索引

唯一索引用于改善性能和保证数据完整性,不允许表里有重复值,其他和普通单列索引一样。允许NULL值的字段不能创建唯一索引。

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME)
联合索引

联合索引基于一个表中的多个字段的索引。联合索引中即使字段一样,但顺序不同,也属于不同的联合索引,查询速度也不同。

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN1,COLUMN2)

下面主要比较一下单列索引和联合索引

单列索引&联合索引

联合索引
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `stu_id` varchar(20) DEFAULT NULL COMMENT '学号',
  `name` varchar(30) DEFAULT NULL COMMENT '姓名',
  `phone` varchar(30) DEFAULT NULL COMMENT '电话',
  `address` varchar(30) DEFAULT NULL COMMENT '家庭住址',
  PRIMARY KEY (`id`),
  KEY `联合索引` (`stu_id`,`name`,`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='学生表';
student表

1、针对索引字段stu_id查询,联合索引有效

EXPLAIN
SELECT * from student where stu_id = '004';

2、针对索引字段name查询,联合索引无效

EXPLAIN
SELECT * from student where name = '小军';

3、针对索引字段phone查询,联合索引无效

EXPLAIN
SELECT * from student where phone = '14785454554';

4、针对索引字段stu_id和phone查询,联合索引有效

EXPLAIN
SELECT * from student where stu_id = '004' AND phone = '14785454554';

5、针对索引字段stu_id和name查询,联合索引有效

EXPLAIN
SELECT * from student where stu_id = '004' AND name = '小军';

6、针对索引字段phone和name查询,联合索引无效

EXPLAIN
SELECT * from student where phone = '14785454554' AND name = '小军';

7、针对索引字段phone、name、stu_id查询,联合索引有效

EXPLAIN
SELECT * from student where phone = '14785454554' AND name = '小军' AND stu_id = '004';

8、针对索引字段stu_id、name查询,不是and,是or,联合索引无效

EXPLAIN
SELECT * from student where stu_id = '004' OR name = '小军';
单列索引

删除掉联合索引,分别给stu_id、name、phone创建单列索引

ALTER TABLE student DROP INDEX 联合索引;
ALTER TABLE student ADD INDEX 学号索引(stu_id);
ALTER TABLE student ADD INDEX 姓名索引(name);
ALTER TABLE student ADD INDEX 电话索引(phone);

1、针对索引字段stu_id查询,学号索引有效

EXPLAIN
SELECT * from student where stu_id = '004';

2、针对索引字段name查询,姓名索引有效

EXPLAIN
SELECT * from student where name = '小军';

3、针对索引字段phone查询,电话索引有效

EXPLAIN
SELECT * from student where phone = '14785454554';

4、针对索引字段stu_id、phone查询,学号索引有效,电话索引无效

EXPLAIN
SELECT * from student where stu_id = '004' AND phone = '14785454554';

5、针对索引字段stu_id、phone查询,学号索引有效,电话索引无效(跟where后面的条件顺序无关)

EXPLAIN
SELECT * from student where phone = '14785454554' AND stu_id = '004' ;

6、针对索引字段stu_id、phone、name查询,学号索引有效,电话索引无效、姓名索引无效

EXPLAIN
SELECT * from student where phone = '14785454554' AND name = '小军' AND 
stu_id = '004';

7、针对索引字段phone、name查询,or关系,姓名索引、电话索引均无效

EXPLAIN
SELECT * from student where phone = '14785454554' OR name = '小军';
单列索引、联合索引同时存在
ALTER TABLE student ADD INDEX 联合索引 (stu_id,name, phone);
EXPLAIN
SELECT * from student where stu_id = '001';
总结

1、创建联合索引时,要考虑列的顺序,如果使用前几列查询,联合索引有效,后几列查询,联合索引无效。
2、联合索引使用最左前缀原则,例如A,B两个字段都会在查询中用到,但A使用的频率更高,就将A作为联合索引的第一个字段,放在最左边。
3、当存在多个单列索引可以用时,mysql会根据查询优化策略选择其中一个单列索引,并不是每个单列索引都生效。
4、当同时存在单列索引和联合索引,mysql会根据查询优化策略选择其中一个索引。
5、如果where中的关系是or,索引不生效。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容