Mysql索引优化实战一
2025-08-30 11:56:07 0 举报
AI智能生成
Mysql索引优化实战一
作者其他创作
大纲/内容
索引最佳实践2
联合索引第一个字段用范围不会走索引
EXPLAIN SELECT * FROM employees WHERE name > 'LiLei' AND age = 22 AND position ='manager';
结论:联合索引第一个字段就用范围查找不会走索引,mysql内部可能觉得第一个字段就范围,结果集应该很大,回表效率不高,还不
如就全表扫描
结论:联合索引第一个字段就用范围查找不会走索引,mysql内部可能觉得第一个字段就范围,结果集应该很大,回表效率不高,还不
如就全表扫描
强制走索引
结论:虽然使用了强制走索引让联合索引第一个字段范围查找也走索引,扫描的行rows看上去也少了点,但是最终查找效率不一定比全表
扫描高,因为回表效率不高
扫描高,因为回表效率不高
覆盖索引优化
子主题
in和or在表数据量比较大的情况会走索引,在表记录不多的情况下会选择全表扫描
子主题
ike KK% 一般情况都会走索引
子主题
索引下推优化详解
like KK%其实就是用到了索引下推优化
什么是索引下推了?
对于辅助的联合索引(name,age,position),正常情况按照最左前缀原则,SELECT * FROM employees WHERE name like 'LiLei%'
AND age = 22 AND position ='manager' 这种情况只会走name字段索引,因为根据name字段过滤完,得到的索引行里的age和
position是无序的,无法很好的利用索引。
在MySQL5.6之前的版本,这个查询只能在联合索引里匹配到名字是 'LiLei' 开头的索引,然后拿这些索引对应的主键逐个回表,到主键索
引上找出相应的记录,再比对age和position这两个字段的值是否符合。
MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的所有字段先做判断,过滤掉不符合条件的记录之后再回表,可
以有效的减少回表次数。使用了索引下推优化后,上面那个查询在联合索引里匹配到名字是 'LiLei' 开头的索引之后,同时还会在索引里过
滤age和position这两个字段,拿着过滤完剩下的索引对应的主键id再回表查整行数据。
AND age = 22 AND position ='manager' 这种情况只会走name字段索引,因为根据name字段过滤完,得到的索引行里的age和
position是无序的,无法很好的利用索引。
在MySQL5.6之前的版本,这个查询只能在联合索引里匹配到名字是 'LiLei' 开头的索引,然后拿这些索引对应的主键逐个回表,到主键索
引上找出相应的记录,再比对age和position这两个字段的值是否符合。
MySQL 5.6引入了索引下推优化,可以在索引遍历过程中,对索引中包含的所有字段先做判断,过滤掉不符合条件的记录之后再回表,可
以有效的减少回表次数。使用了索引下推优化后,上面那个查询在联合索引里匹配到名字是 'LiLei' 开头的索引之后,同时还会在索引里过
滤age和position这两个字段,拿着过滤完剩下的索引对应的主键id再回表查整行数据。
索引下推会减少回表次数,对于innodb引擎的表索引下推只能用于二级索引,innodb的主键索引(聚簇索引)树叶子节点上保存的是全
行数据,所以这个时候索引下推并不会起到减少查询全行数据的效果。
行数据,所以这个时候索引下推并不会起到减少查询全行数据的效果。
为什么范围查找Mysql没有用索引下推优化?
估计应该是Mysql认为范围查找过滤的结果集过大,like KK% 在绝大多数情况来看,过滤后的结果集比较小,所以这里Mysql选择给 like
KK% 用了索引下推优化,当然这也不是绝对的,有时like KK% 也不一定就会走索引下推。
KK% 用了索引下推优化,当然这也不是绝对的,有时like KK% 也不一定就会走索引下推。
mysql优化器索引选择探究
mysql 如何选择合适的索引
联合索引是范围查找 根据查找主键在去 主键索引树查到最终结果 成本比全表扫描高 可以用 覆盖索引优化 但是即便是条件内容不同也可走 走索引或者不走 。用trace工具来一查究竟
子主题
索引优化 group by 与order by
子主题
using filesort文件排序详解
单路排序:
是一次性取出满足条件行的所有字段,然后在sort buffer中进行排序;用trace工具可
以看到sort_mode信息里显示< sort_key, additional_fields >或者< sort_key,
packed_additional_fields >
以看到sort_mode信息里显示< sort_key, additional_fields >或者< sort_key,
packed_additional_fields >
双路排序(又叫回表排序模式)
是首先根据相应的条件取出相应的排序字段和可以直接定位行
数据的行 ID,然后在 sort buffer 中进行排序,排序完后需要再次取回其它需要的字段;用trace工具
可以看到sort_mode信息里显示< sort_key, rowid >
数据的行 ID,然后在 sort buffer 中进行排序,排序完后需要再次取回其它需要的字段;用trace工具
可以看到sort_mode信息里显示< sort_key, rowid >
MySQL 通过比较系统变量 max_length_for_sort_data(默认1024字节) 的大小和需要查询的字段总大小来
判断使用哪种排序模式。
如果 字段的总长度小于max_length_for_sort_data ,那么使用 单路排序模式;
如果 字段的总长度大于max_length_for_sort_data ,那么使用 双路排序模∙式。
判断使用哪种排序模式。
如果 字段的总长度小于max_length_for_sort_data ,那么使用 单路排序模式;
如果 字段的总长度大于max_length_for_sort_data ,那么使用 双路排序模∙式。
索引设计原则与实战
不要在小基数上建索引 就是 性别 还不如全表扫描
长字符串可以创建前缀索引。字符太长会占用内存
where 和 order 冲突有限 满足where 查询出范围 在进行排序
基于慢sql 查询做优化
可以根据监控后台的一些慢sql,针对这些慢sql查询做特定的索引优化 记录慢sql 进行分析
社交APP索引创建思路, 一般读多写少可以建3,4个索引 其他情况创建1,2个索引
联合索引尽量覆盖条件
码先行,索引后上
0 条评论
下一页