1:避免全表扫描
考虑在 where 和 order by 涉及的列上建立索引,in 和 not in 也要慎用,尽量用 between 取代。
2:优化COUNT 查询
count 可以统计列的数量,统计列值时要求列非空;COUNT 还可以统计行数,当 MySQL 确定括号内的表达式不可能为 NULL 时,实际上就是在统计行数。当使用 COUNT(*)时,会忽略所有列而直接统计行数。某些业务场景不要求完全精确的 COUNT 值,此时可以使用近似值来代替,EXPLAIN 估算的行数就是一个不错的近似值。
3:避免子查询
在 MySQL5.5 及以下版本避免子査询,因为执行器会先执行外部的 SQL 再执行内部的 SQL,可以用关联查询代替。
4:禁止排序
当查询使用 GROUP BY 时,结果集默认会按照分组的字段进行排序,如果不关心顺序,可以使用 ORDER BYNULL 禁止排序。
5:优化分页
在偏移量非常大的时候,需要查询很多条数据再舍弃,代价非常高。最简单的优化是尽可能地使用覆盖索引扫描,而不是查询所有的列,然后做关联操作再返回所需的列。还有一种方法是从上一次取数据的位置开始扫描,避免使用 OFFSET。
6:优化 UNION
MySQL通过创建并填充临时表的方式来执行 UNION 查询,除非确实需要消除重复的行,否则使用 UNIONALL,如果没有 ALL 关键字,MySQL 会给临时表加上 DISTINCT 选项,对整个临时表的数据做唯一性检查代价非常高。
7:使用用户自定义变量用户自定义变量
是一个用来存储内容的临时容器,在连接 MySQL 的整个过程中都存在,可以在任何可以使用表达式的地方使用自定义变量,避免重复查询刚刚更新过的数据
评论 (0)