一. 基础调优(从Sql语句角度)
1. 单条记录查询最后添加 limit 1, 避免全表查询;
2. 针对sql执行过长的语句进行explain解析, 再做相应调优;
3. where子句尽量避免:
- 表达式;
- 对null值判断,建议对null值设置默认值0;
- 函数操作;
- 使用!=或<>操作符;
- 在 = 左边进行函数,算数运算或其他表达式运算;
- ......
4. or 前后两个列字段都是索引时,查询才会走索引,
5. 尽量使用in运行符来替代or运算,对于连续的数值可以用between...and...替代in;
select num from table_a a where exists(select 1 from table_b where num=a.num);
6. 无重复记录的结果集使用union all合并;
7. 模糊查询like的优化查询, 替代 like '%a%
- LOCATE(substr,str,pos)方法: 返回substr在str中第一次出现的位置. 如果substr在str中不存在, 返回值为0; 如果pos存在,返回substr在st 第pos个位置后第一次出现的位置, 示例: select * from table_a where LOCATE(substr,str)>0 select * from table_a where LOCATE(substr,str,pos)>0 - POSITION(substr IN field)方法: position可以看做是locate的别名,功能跟locate一样. substr是要搜索的内容,field为被匹配的字段,查询出所有filed中存在substr的数据. 示例:
select * from table_a where POSITION(substr IN field))
8. 避免select * from table_a, 而使用select 字段 from table_a;
9. 避免向客户端返回大量数据, 若数据量过大, 应考虑是否合理.
二. 进一步调优(从数据库设计,数据库表设计角度)
1. 添加索引
- 针对以读为主要业务且数据量较大的表
原因: 1) 添加索引能在某些场景下提高查询效率,但索引需要维护,一定程度上会使DML操作变慢;
2) 索引会占用磁盘额外存储空间.
- 对where及order by 涉及的字段上添加索引,一个表索引最好不要6个;
2. 设计表时, 在满足业务的前提下, 表中字段宽度尽可能的小;
3. 在可能情况下, 尽量将字段设置为 not null, 避免将来执行查询对null值判断;
4. ...