zoukankan      html  css  js  c++  java
  • mySql单列索引与联合索引的区别

    引自https://my.oschina.net/857359351/blog/658668

       第一张表gift和索引为联合索引,如图:

    第二张表gift2为单列索引,如图:

    下面开始进行测试:

    相同的SQL分别查询两张表,使用EXPLAIN解析一下SQL 

      select * from gift  where name = '道具' and scene_type=1;  

      select * from gift2 where name=‘道具’ and scene_type=1;

         显示的结果为两条SQL都会使用到索引,这我就不上图了。

    然后只查询其中的某列,但是这个列已经创建索引 

      select name,status from gift  where name = '道具' and scene_type=1; 

      select name,status from gift2 where name=‘道具’ and scene_type=1;

        显示的结果为两条SQL也都使用了索引。

    继续查询没有创建索引的列,这里rank字段并没有创建索引 

      select name,status,rank from gift  where name = '道具' and scene_type=1; 

      select name,status,rank from gift2 where name=‘道具’ and scene_type=1;

         显示的结果为两条SQL也都使用了索引。

    接下来把SQL调整一下,name字段都建立了索引,下面把where条件里的name条件去掉 

      select name,status from gift  where scene_type=1; 

      select name,status from gift2 where scene_type=1;

         显示的结果为两条SQL也都使用了索引。

      select name,status,rank from gift  where scene_type=1;

      select name,status,rank from gift2 where scene_type=1;

       第一条SQL根本没有用到索引,第二条SQL还和以前一样,同样使用到了索引。

      其实在联合索引上会有一个mysql索引最左匹配原则,但是如果联合索引的第一个列不在where条件语句中,并且所查询的列其中有的是没有建立索引的,那么这个联合索引就是无效的,具体为什么会这样我也还没有整明白(囧),不过以后再写SQL也会注意一下这方面的问题,而且公司DBA也建议如果使用联合索引,那么where条件也要尽量根据联合索引的顺序来,如果不按照顺序来,索引也同样会用到,但是在执行前,SQL优化器也会将条件调整为联合索引的顺序,既然可以直接避免这种情况,就没必要再让SQL优化器去处理,毕竟处理也是有开销的。

  • 相关阅读:
    07微博绑定用户接口(我们的约定还算数嘛。)
    08vue 微博回调空页面(最终还是没能留住你。)
    06vue微博回调空页面 (你还会来嘛)
    05微博回调接口 (念念不忘,必有回响吗。)
    04vue获取微博授权url(再也得不到你了。)
    03生成微博授权的url接口(再也没有你了)
    02微博开放平台使用方法 (在哪也不会再遇见你了。)
    01微博三方登录原理讲解(再多三方登录,也看不到你的信息。)
    Django-celery异步短信验证码(0)
    Django之重写用户表注册接口(redis缓存)
  • 原文地址:https://www.cnblogs.com/zhima-hu/p/7323442.html
Copyright © 2011-2022 走看看