1、关联查询优化
select * from A(驱动表) join B(被驱动表)on A.id = B.id;
- 保证被驱动表的join字段已经被索引(即建立了外键关系);
- left join时,选择小表作为驱动表,大表作为被驱动表;
- inner join 时,mysql会自动帮你把小结果集的表选为驱动表;但是有时候不理想,可以使用STRAIGHT_JOIN 替代inner join,明确指定驱动表和被驱动表;
- 子查询尽量不要放在被驱动表,有可能使用不到索引;
- 能够直接多表关联的尽量直接关联,不用子查询;
2、子查询优化
- 尽量不要使用not in 或者not exists;用left outer join on xxx is null代替;
3、排序、分组优化
- 避免无过滤条件排序,分页也算过滤条件;
- 避免顺序错(有索引的字段放前面,组合索引最左前缀原理)排序、分组;
- 避免多字段排序方向不同,如order by a asc,b desc;
4、覆盖索引
- select具体字段不要select *,这样用不上索引的情况时可以用覆盖索引;