一、从使用上索引考虑。
1、为查询过滤、连接、group by,order by等字段建立索引。group by 和 order by 尽量设置为主表字段,且不能跨表。
2、模糊查询前缀不能有%,或者为模糊查询的所有字段加联合索引,走覆盖索引
3、OR改为union all
4、少用not in、<>、is null 、is not null、not exist。这里不是说一定不走索引,只是概率小,如果可以字段都设置为非空。
5、索引列不能为计算函数且索引列数据类型不能被隐式转换。
二、从查询功能上考虑
1、尽量少嵌套,尤其是嵌套后面还有where条件的,这样查询生成的临时表没有索引,再次过滤导致查询慢。
2、子查询改为连接查询,对于有group by 的子查询,如果查询结果和子查询是一对多的关系,可改为连接后,把group by 放在最后。如果查询结果和子查询是多对一,或者多对多,可以考虑拆为两个查询,在应用上做连接。where带子查询没转为连接的,要把子查询放在小表上,where条件子查询会遍历表的每一行。
3、有多表关联的,不是查全部数据,尤其是带有分页功能的,可以根据过滤条件先查出主表的部分主键做where条件,然后再和其他表做关联。