MySQL复合索引的个人分析

分享 未结
1 104
!腾飞!
!腾飞! 2019-09-03
MySQL的复合索引有一个最左匹配原则,举例说明: 创建数据表如下: img[https://img-blog.csdnimg.cn/20190814194701949.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] 添加测试数据: img[https://img-blog.csdnimg.cn/20190814201812897.png] 创建复合索引,包含a,b,c三个字段,并查看索引性信息 img[https://img-blog.csdnimg.cn/20190814194529453.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] <1> 使用a,b,c作为where查询条件,explain查看执行计划:使用了索引 img[https://img-blog.csdnimg.cn/20190814194938458.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] <2> 使用a,b作为where查询条件,explain查看执行计划:使用了索引 img[https://img-blog.csdnimg.cn/20190814195057460.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] <3> 使用a作为where查询条件,explain查看执行计划:使用了索引 img[https://img-blog.csdnimg.cn/20190814195339145.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] <4> 使用b,c作为where查询条件,explain查看执行计划:没有使用索引,因为最左匹配原则,索引字段为”a,b,c“,a字段在最左边, img[https://img-blog.csdnimg.cn/2019081419524758.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] <5> 使用b作为where查询条件,explain查看执行计划:没有使用索引 img[https://img-blog.csdnimg.cn/20190814195427935.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] <6> 使用b,c,a作为where查询条件,explain查看执行计划:使用了索引,也就是说用到索引,与where语句中字段出现的顺序无关 img[https://img-blog.csdnimg.cn/20190814195518865.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] img[https://img-blog.csdnimg.cn/2019081419554639.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] <7> 使用复合索引中的部分索引(最左那个字段)和没有索引的字段作为查询条件,explain查看执行计划:使用了索引 img[https://img-blog.csdnimg.cn/20190814195725252.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] 但如果使用的是复合索引中的部分索引不是最左那个字段,如b字段和不是索引的c字段作为查询条件,explain执行计划:没有用到索引! img[https://img-blog.csdnimg.cn/20190814203707944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] 补充:like的模糊查询也有一个原则:最左前缀原则,就是说like的字段值在通配符左边,如” where a like '123%' “,会用到索引: img[https://img-blog.csdnimg.cn/20190814201203426.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] 查询字段值在通配符%右边,如” where a like ‘%123’ “,不会用到索引 img[https://img-blog.csdnimg.cn/20190814201139524.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NwYWNlWF85MQ==,size_16,color_FFFFFF,t_70] img[https://img-blog.csdnimg.cn/20190814205343603.png]
回帖
  • !腾飞!
    2019-09-03
    作者自己亲自建表并测试的!有其他情况欢迎评论区交流!!
    0 回复
黄金赞助商
关注公众号

关注公众号,随时随地交流技术