免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: 龙雪刚
打印 上一主题 下一主题

求解,索引选择与索引长度 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-05-03 12:58 |只看该作者
引用
RogerZhuo 发表于 2012-04-13 04:17
这个图片的结构就很说明问题了,说明为什么只扫描二级索引,还有为何是覆盖索引,不会回表。

论坛徽章:
0
12 [报告]
发表于 2012-05-03 20:28 |只看该作者
好吧,我也来说几句。

第一,LZ在1L问的为什么长度是137, 原因是:你的字符集是utf8,每个字符占3个字节,所以是45*3+2。这个2是因为innodb里面所有的二级索引都包含了主键,主键是smallint,占2字节。
那么为什么不选择走主键索引呢? 说实话,我刚看你SQL语句也觉得该走主键索引,但是既然实际情况没走,那么肯定就有它自己的原因了,我个人猜想是:1,因为你需要的字段都可以在二级索引idx_actor_last_name里面得到。2,主键索引比二级索引大得多,在优化器看来还不如直接走二级索引来个扫描,扫描主键索引可能需要更多的IO。

第二,LZ在4L说的,你怎么扯出个135了? 你强制使用主键索引,所以索引长度是2很正常啊,与135有什么关系?

最后说明的是:mysql的优化器做得确实不是很到位,所以又时候没有预期的也属比较正常。另外关于explain的key_len这一列,我想说明一下,它表示实际使用到的索引长度, 比如有一个索引idx_a_b(a,b),优化器在实际执行中使用到了idx_a_b的那一部分,那么key_len 就是这部分,而不是这整个索引的长度。还有,如果你的字段允许为空,那么key_len要加1,这一个字节用来判断是否为空。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP