SQL 本身并不难学,编写查询语句也很容易,但是想要编写出能够高效运行的查询语句却有一定的难度。
查询优化是一个复杂的工程,涉及从硬件到参数配置、不同数据库的解析器、优化器实现、SQL 语句的执行顺序、索引以及统计信息的采集等,甚至应用程序和系统的整体架构。
本文介绍几个关键法则,可以帮助我们编写高效的 SQL 查询;尤其是对于初学者而言,这些法则至少可以避免我们写出性能很差的查询语句。
法则一:只返回需要的结果
(1)避免使用
SELECT * FROM
法则二:确保查询使用了正确的索引
(1)经常出现在
WHERE 条件中的字段建立索引 -> 避免全表扫描
(2)将
ORDER BY 排序的字段加入到索引中 -> 避免额外的排序操作
(3)多表连接查询的关联字段建立索引 -> 提高连接查询的性能
(4)将
GROUP BY 分组操作字段加入到索引中 -> 利用索引完成分组
索引失效:
在
WHERE 子句中对索引字段进行表达式运算或者使用函数都会导致索引失效,还包括字段的数据类型不匹配,例如字符串和整数进行比较
使用
LIKE 匹配时,如果通配符出现在左侧无法使用索引
如果
WHERE 条件中的字段上创建了索引,尽量设置为 NOT NULL ;不是所有数据库使用 IS [NOT] NULL
判断时都可以利用索引
EXPLAIN:
如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划,通过执行计划(EXPLAIN)确保查询使用了正确的索引
法则三:尽量避免使用子查询,考虑使用
JOIN 进行重写
法则四:不要使用 OFFSET 实现分页(实用~)
分页查询的原理就是先跳过指定的行数,再返回 Top-N 记录。
法则五:了解 SQL 子句的逻辑执行顺序
(6)SELECT [DISTINCT | ALL] col1, col2, agg_func(col3) AS alias(1) FROM t1
JOIN t2(2) ON (join_conditions)(3) WHERE where_conditions(4) GROUP BY col1,
col2(5)HAVING having_condition(7) UNION [ALL] ...(8) ORDER BY col1 ASC,col2
DESC(9)OFFSET m ROWS FETCH NEXT num_rows ROWS ONLY;
总结
SQL 优化本质上是了解优化器的的工作原理,并且为此创建合适的索引和正确的语句;同时,当优化器不够智能的时候,手动让它智能。
来源: