Mysql 索引优化

Posted: 2019-08-09  By  vilay  |  Views(94)

1.什么情况下使用索引

1.需要频繁查询的字段,经常作为where条件
2.需要经常group by 或者order by的字段
3.update,delete的条件列一般也需要
4.distinct 的字段
5.多表joinon条件以及查询条件也要

2.使用索引的细节问题

比如语句:select * from order_products group by product_id order by pay_time desc

几个细节问题

1.建联合索引比给product_id,pay_time建单列索引更高效
2.联合索引的顺序问题,idx(product_id,pay_time)比idx(pay_time,product_id)更高效,因为查询语句先执行group by

在多表关联的时候,表数量尽量不要超过3张,每增加一张表就相当于增加一个嵌套循环,表过大也不建议关联查询。

多表关联几个细节问题

1.where条件建索引
2.on连接的字段建索引,并且字段在多张表的类型中必须一致,不能一个是int,一个是varchar

3.不用索引的情况

索引虽然好用,但是也不建议全部字段都加索引,索引多了影响insert的性能。

1.没有频繁查询的可以不建索引
2.表记录比较少也可以不用建
3.字段重复数据过多,比如状态的字段,就0,1两个值
4.频繁更新的字段,要具体看下情况,更新的时候也需要更新索引,会比较慢

4.索引失效

建了索引不等于就没事干了,索引在某些情况下会失效

1.对索引列用了表达式计算
2.索引列使用了函数
3.在or条件中,如果前面的条件加了索引,后面的条件没有加索引,也会失效
4.使用like进行模糊查询的时候,比如  like '%hello'
5.索引列使用了null,或者not null比较判断
6.联合索引的时候要注意最左原则

最左原则也就是需要从左到右的使用索引中的字段,一条 SQL语句可以只使用联合索引的一部分,但是需要从索引最左侧开始,否则会失效。

mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

美团技术团队-MySQL索引原理及慢查询优化