join优化
确保on和using字句有索引,考虑关联顺序
索引where和排序冲突的时候,改成关联表方式或者子查询
mysql5.6之前的一般需要改子查询为关联表
走索引不一定都快,区分度不够的索引可用考虑用复合索引
多值 max,改为group后max
join 时要考虑类型一致,char型要考虑字符集一致,时间类型没走索引,要注意隐世转换
select in 会被改写为exists,造成查询缓慢,可改成关联join查询
驱动表的选择,认清关联字段索引,可用straight_join验证猜想
query cache并不适合更新,插入,删除非常大的应用
group by,order by 只涉及表中一个列
order by +limit 将limit,order by内嵌,限制join数量和保证index排序
join时 尽量将条件内嵌,先过滤后join。
知道仅有一条时,用limit 1 限制
not in或not exits 可转换为外连接或等值连接
某些情况下 or 可用用union all 或union 代替
排序优化
单表查询,若file sort 则可以用强制使用索引排序,或者用自关联方式
需要where+sort 或者多个sort 做联合索引,并考虑加上排序
sort buffer
与group by 连用时 用order by null 禁用排序
别名 若和字段重复也会影响排序优化
索引长度导致不能优化
相关参数
A. sort_buffer_size 排序缓存。
B. read_rnd_buffer_size 第二次排序缓存。
C. max_length_for_sort_data 带普通列的最大排序约束。
file sort过程-普通&双路排序
取出字段a和每行的物理id(tid),然后在sort_buffer_size 中排序
根据排序好的tid从磁盘中拿到行数据,放到read_rnd_buffer_size中
file sort过程-冗余单路排序
区别是第一次是拿到所有相关数据而不只是TID,所以不用二次去磁盘取
file sort 优化
增加相关参数大小
增强tempdir 指向的文件系统io
limit优化
当与order by 字段联合使用时,若排序字段有重复,需要增加排序列,否则数据会错