单表
- 全值匹配我最爱,where后面有几列建复合索引。
- 最佳左前缀法则,如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中间的列。
- 不在索引列上做任何操作(计算、函数、(自动或手动)类型转换),会导致索引失效。where abs(a) = 12;
- 存储引擎不能使用索引中范围条件右边的列,范围查询列放最后建索引。
- mysql 在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描。
- is not null 也无法使用索引,但是is null 是可以使用索引的。
- like 已通配符开头(%abc)索引会失效,全表扫描。
- 字符串不加单引号索引失效。
索引->平衡二叉树
多表关联
- 保证被驱动表的join字段已经被索引。
- left join时,选择小表作为驱动表,大表作为被驱动表。
- inner join 时,mysql 会自己帮你把小结果集的表作为驱动表。(在不影响结果的情况下优化器调整,order by 多列就不会调整),如果优化后还是大表是驱动表,可以使用STRAIGHT_JOIN指明驱动表。
- 子查询尽量不要放在被驱动表,有可能使用不到索引。
- 能够直接多表关联的尽量直接关联,不用子查询,子查询会新增一趟独立查询。
子查询优化
尽量不要使用not in 或者not exists,用left join on xxx is null 替代。一个表里有,一个关联查询,尽量关联查询。
order by&group by
- 无过滤,不索引。没有过滤条件(where age = 10; limit 10等)索引用不上。
- 顺序错,必排序。order by 后面顺序不符合建的复合索引的顺序,Using filesort:。
- 方向反,必排序。order by 后面要么都升序,要么都降序。一升一降Using filesort:。