慢查询
分析:
explain select 语句
优化
1.索引
- 添加索引/复合索引
- 索引AND可复合索引,单独时只用到一个
- 需要考虑复合索引的字段顺序。例:
符合索引为(a,b,c,d)时,a = 1 and b=2 and c>3 and d=4 或者a = 1 and b=2 and d=4 and c>3时,用不到d索引。(a,b,d,c)则可以用到d。a,b,c,d的查询顺序可以任意调整,不影响,查询优化器会优化成索引可以识别的形式
想建立a,b字段联合索引,且b字段已有索引经常单独查询,则应建立(b,a)的联合索引。
2.表
- 分表,大表拆小表
- 合理设计表(范式、数据类型)
3.查询语句
3.1 查询内容
- 尽量避免 select *,避免回表查询(首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录)
- 调整where子句的连接顺序,将过滤数据多的条件放在前面
- 避免在大表上的group by,order by,offset 操作
- 尽量减少子查询(子查询会创建临时表,查询完毕删除临时表)
- 尽量减少联表查询,联表查询是笛卡尔乘积的形式,检索的数据几何倍上升
- 一次查询的结果最好不要过大,可以使用分页查询(limit),且利用表的覆盖索引来加速分页查询(查询的语句中只包含索引列)
3.2 避免索引失效
- like以%开头
- >、<号右边的索引会失效
- !=、<>、not、is not null会导致索引失效
- 优化方法: key<>0 改为 key>0 or key<0
- is null是可以使用到索引的,is not null不能
- 索引列参与计算、使用函数
- 对于复合索引,如果不使用前列,后续列也将无法使用
- or 语句前后没有同时使用索引
- 两边都用索引