Mysql索引优化


(1)InnoDB存储引擎的索引为主键索引;

(2)从多个索引选择最优的执行计划时需要花费时间;

(3)如果存在大量的更新,插入或者删除,那么索引需要实时的维护;

(4)在数据库内核实现索引是非常复杂的,如何最大程度的满足并发,以及如何

需要慎重使用索引,而不是盲目的使用索引。



(1)单表扫描的花费为C1,使用索引扫描的花费为C2,进一步判断C1和C2的关系,如果C2小,那么使用索引扫描,如果C1小,

   那么使用单表扫描;

 (2)根据启发式规则来判断基于索引的扫描方式通常由于单表扫描的方式,可以强制优化器来使用索引。









  type:All:表示是全表扫描;

 type:const,常量表,有确定的固定值,主键索引;

 


 

       key1=10; 得到的是一个常量表的扫描,执行效率高;

      而key1 != 10;不等值操作,type:All,表示Mysq执行的是全表扫描,查询优化器觉得全表扫描的执行效率比索引扫描高,所以选择了

   全表扫描;


  key2>10,使用全表扫描,因为索引的选择率高于10%,此时选择全表扫描;

 key2<10;数据的选择率低于10%,此时选择索引扫描;


 

  key_part1为复合索引的前缀部分,而key_part2为复合索引的非前缀部分,所以无法利用到索引;

  

    Using index condition:表示使用了索引下推技术,但是无法避免读取数据文件;

    Using index:表示使用了索引,并且避免读取了数据文件;如果我们要获取的列在索引列中,那么可以使用只读索引技术快速的获取数据信息;


    

   id列参与了表达式计算,导致无法利用到id列上的索引,所以使用了全表扫描;

 

in和between ... and ...是可以利用到索引的;






eq_ref:等值的引用方式,引用了tk1表的id,



   如果使用了<操作,两个表的扫描方式都为全表扫描,虽然使用了索引关键字,但是没有使用到索引;





第二个语句真正做的还是一个内连接的操作,因为等值满足空值拒绝;



等值连接满足空值拒绝,所以查询优化器把左外连接优化为内连接;


Cause1和Cause2表明数据的值对于消除左外连接是有影响的;




group by 的列是一个索引列,那么可以使用索引扫描来完成分组操作;

groub by abs(id),如果在列上执行了函数操作,此时是不能利用索引进行分组操作优化的;



复合索引的前缀部分出现在group 的列中,那么可以使用只读索引来完成分组操作的优化;

 


     第二个语句:group by 分组语句部分没有使用复合索引的前缀部分,而是使用了中间部分,MySql不能利用索引来完成分组操作的优化,

     会使用临时表和文件排序操作;



 如果在id列上加一个函数,那么就不能利用索引了。


 

    在复合索引上进行order by的操作,那么可以利用索引来优化,Using index表示使用到了只读索引;

   


如果把复合索引的前缀去掉,order by语句中只出现复合索引的后半部分,那么此时Mysql不支持利用索引对order by进行优化;



   在主键列上添加了-号,此时也不能利用到索引对order by进行优化;



distinct后面跟主键列的话可以使用到索引,此时可以把distinct关键字去掉;



      第一条语句说明如果distinct后跟一个唯一索引列的话,也可以使用到索引;

     第二条语句说明如果distinct后跟一个索引列的话,也可以使用到索引;

  


   图:如果distinct后跟一个复合索引的一部分的话,可以使用到索引,但是Using temporary表明使用了临时表来进行了distinct的操作;

  第二个语句说明如果在一个普通列上执行distinct操作的话,那么不会使用到索引,使用临时表来进行去重的操作;

 


       如果在主键前面加上-号的话,从Using temporary来看的话,尽管使用到了索引,但是还是使用了临时表来完成去重的操作;



Select tables optimized away: 表示使用了索引直接求得最大值和最小值;




    count(*)是可以利用索引来完成计数工作的;

    


     在一个普通列上求sum操作,那么会利用全表扫描,在一个复合索引的一个列上求sum操作,会使用到索引;

    


    






第一个语句的group by 后面使用的是一个复合索引的非前缀部分,在一个前缀列上求的最值,那么mysql不支持优化;

第二个语句表明如果group by后面是复合索引的前缀部分,那么mysql使用只读索引来优化;

 


   如果group by后面的列是复合索引的非前缀列,那么会使用Using temporary和Using filesort





如果order by 后面是非主键索引或者是复合索引的非前缀部分,mysql也是支持使用索引来进行优化的;



       Mysql认为空值是不等于空值的;

      





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波哥的技术积累

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值