mysql 联合索引

联合索引使用规则

问题:

假设某个表有一个联合索引(c1,c2,c3,c4)以下只能使用该联合索引的c1,c2,c3部分

A where c1=x and c2=x and c4>x and c3=x

B where c1=x and c2=x and c4=x order by c3

C where c1=x and c4= x group by c3,c2

D where c1=? and c5=? order by c2,c3

E where c1=? and c2=? and c5=? order by c2,c3

一、创建测试表和联合索引

创建表t1,有c1到c5共5个字段,特别说明一下,字段类型都是定长char(1) 类型,并且非空,字符集是utf8(与计算索引使用字节数有关)。

create table t1(

c1 char(1) not null default '',

c2 char(1) not null default '',

c3 char(1) not null default '',

c4 char(1) not null default '',

c5 char(1) not null default ''

)engine myisam charset utf8;

 创建联合索引:

alter table t1 add index c1234(c1,c2,c3,c4);

插入3条数据:

insert into t1 values('a','b','c','d','e'),('A','b','c','d','e'),('a','B','c','d','e');

 二、分析

1、A选项


我们看解析A这条sql的结果,与索引有关的主要是possible_keys,key,key_len这三项,possible_keys是指可能会用到的索引,key是当前sql使用到的索引,key_len是索引的使用字节数。key的值是c1234表示联合索引用上了,那是不是c1,c2,c3,c4全用上了咧,我们得从key_len分析一下。

    因为字段类型是char(1),字符集是utf8,所以每个字段的key_len 是

1*3=3,key_len现在等于12表示c1,c2,c3,c4这四个字段都用上了索引,(如果字段类型是null,那单个字段的索引字节数需要

+1,如果字段类型为非定长类型,比如varchar,那字节数需要再 +2,这里方便理解,统一定义成了定长char)

2、B选项


我们看到key=c1234,表示B使用了联合索引,key_len=6表示有两个字段使用了索引,这两个字段就是C1和c2,这个sql里面有一个order

by c3,order by不能使用索引,但是却利用了索引,为什么这么说咧,如果我们改成order by c5,看下面的:

    与上面的结果对比,发现在Extra中的值使用了Using filesort。Using

filesort表示在索引之外,需要额外进行外部的排序动作。因为c5的顺序是没有规律的,所以需要对其进行一次排序,而在order by

c3的时候,c3其实在索引表里面已经是排好序的了,不需要再排序,所以说其实他利用上了索引。

3、C选项

key=c1234,表示B使用了联合索引,key_len=3表示有1个字段使用了索引,这个字段就是C1,与B语句不一样的是 Extra的值,C语句里面使用了临时表(Using temporary) 和 排序(filesort),因为组合索引是需要按顺序执行的,比如c1234组合索引,要想在c2上使用索引,必须先在c1上使用索引,要想在c3上使用索引,必须先在c2上使用索引,依此类推。回到B语句中,因为c2字段已经使用了索引,所以在order by c3的时候 c3其实在索引表里面已经是排好序的了,不需要建临时表,不需要再排序,所以说其实他利用上了索引。

而C语句中,group by 的顺序是先c3,再c2,在对c3进行group by的时候,c2字段上的索引并没用使用,所以索引在这里就断了,只用上了c1一个字段的索引。

如果group by 的顺序改成c2,c3,会是什么样?

从结果中看没有用到临时表和filesort,因为c2,c3在索引表中本身就是有序的。

4、D选项


从结果中看到key=c1234,表示B使用了联合索引,key_len=3表示有一个字段使用了索引,即C1字段。而c2,c3字段在order

by中是顺序执行,所以也利用了索引。这里没有使用filesort就是因为c2,c3本身在索引表中就是有序的,所以不需要对其再排序。那如果反之,先按c3排序,再按c2排序,会是什么情况,看下面:

从结果中看到使用了filesort,这里就无法合理的使用索引了。举个例子来说,好比中国下的省是有序的,如果按照先找国家再找省那自然是顺序的,而如果反过来,先找省再找国家,那肯定是乱序的,自然也就不能利用索引了。

5、E选项

E语句c1和c2使用了索引,c3在order by中利用了索引。如果再反之,先按c3排序,再按c2排序会是什么情况?

order by c3,c2,按理说应该使用filesort,但从结果中看并没有使用,这是为什么呢?注意仔细看查询条件,c1='a'

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

推荐阅读更多精彩内容

  • 一、什么是联合索引 两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。对于复合索引:Mysql从左到右的...
    Ferrari1001阅读 50,696评论 2 13
  • 索引:排好序利于快速查找的数据结构(Btree) explain/show profile1、typeall - ...
    换煤气哥哥阅读 529评论 0 0
  • 前言 之前看了很多关于MySQL索引的文章也看了《高性能MySQL》这本书,自以为熟悉了MySQL索引使用原理,入...
    PHP菜鸡阅读 3,431评论 0 1
  • 前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,...
    AI乔治阅读 1,966评论 3 9
  • “我认识她啊,她顾我来给她奶奶干活,那老太婆瘫了。从不说话。可是她最近往家里寄了一笔很多的钱回来,也没寄一封...
    夕木君阅读 214评论 0 1