东莞列举网 > 商务服务 > 网站/软件服务 > SQL 查询优化法则
东莞
[切换城市]

SQL 查询优化法则

更新时间:2022-07-28 11:35:56 浏览次数:33次
区域: 东莞 > 南城
类别:IDC服务
地址:南城高盛科技大厦
一:只需要返回需要的结果
一定要为查询语句指定 WHERE 条件,过滤掉不需要的数据信息。通常来说,OLTP 系统每次只需要从大量数据中返回很少的几条记录;指定查询条件可以帮助我们通过索引返回结果,而不是全表扫描。绝大多数情况下使用索引时的性能更好,因为索引(B-树、B+树、B*树)执行的是二进制搜索,具有对数时间复杂度,而不是线性时间复杂度。
二:确保查询使用了正确的索引
如果缺少合适的索引,即使指定了查询条件也不会通过索引查找数据。因此,我们首先需要确保创建了相应的索引
1:经常出现在 WHERE 条件中的字段建立索引可以避免全表扫描;
2:将 ORDER BY 排序的字段加入到索引中,可以避免额外的排序操作;
3:对连接查询的关联字段建立索引,可以提高连接查询的性能;
4:将 GROUP BY 分组操作字段加入到索引中,可以利用索引完成分组,即使创建了合适的索引,如果 SQL 语句写的有问题,数据库也不会使用索引。导致索引失效的常见问题包括。
5:在 WHERE 子句中对索引字段进行表达式运算或者使用函数都会导致索引失效,这种情况还包括字段的数据类型不匹配,例如字符串和整数进行比较;
6:使用 LIKE 匹配时,如果通配符出现在左侧无法使用索引。对于大型文本数据的模糊匹配,应该考虑数据库提供的全文检索功能,甚至专门的全文搜索引擎(Elasticsearch 等)。
7:执行计划(execution plan,也叫查询计划或者解释计划)是数据库执行 SQL 语句的具体步骤,例如通过索引还是全表扫描访问表中的数据,连接查询的实现方式和连接的顺序等。如果 SQL 语句性能不够理想,我们首先应该查看它的执行计划,通过执行计划(EXPLAIN)确保查询使用了正确的索引。
三:尽量避免使用子查询
从执行计划可以看出,MySQL 中采用的是类似 Nested Loop Join 实现方式;将子查询的结果生成一个内存临时表;然后与 employee 表进行连接。通过实际执行时间可以看出这种方式更快。
四:不要使用 OFFSET 实现分页
分页查询的原理就是先跳过指定的行数,再返回 Top-N 记录。
数据库一般支持 FETCH/LIMIT 以及 OFFSET 实现 Top-N 排行榜和分页查询。当表中的数据量很大时,这种方式的分页查询可能会导致性能问题。
查询随着 OFFSET 的增加,速度会越来越慢;因为即使我们只需要返回 10 条记录,数据库仍然需要访问并且过滤掉 N(比如 1000000)行记录,即使通过索引也会涉及不必要的扫描操作。
五:了解 SQL 子句的逻辑执行顺序
SQL 并不是按照编写顺序先执行 SELECT,然后再执行 FROM 子句。从逻辑上讲,SQL 语句的执行顺序如下:
首先,FROM 和 JOIN 是 SQL 语句执行的步。它们的逻辑结果是一个笛卡尔积分,决定了接下来要操作的数据集。注意逻辑执行顺序并不代表物理执行顺序,实际上数据库在获取表中的数据之前会使用 ON 和 WHERE 过滤条件进行优化访问;
其次,应用 ON 条件对上一步的结果进行过滤并生成新的数据集;
然后,执行 WHERE 子句对上一步的数据集再次进行过滤。WHERE 和 ON 大多数情况下的效果相同,但是外连接查询有所区别
接着,基于 GROUP BY 子句指定的表达式进行分组;同时,对于每个分组计算的聚合函数 agg_func 的结果。经过 GROUP BY 处理之后,数据集的结构就发生了变化,只保留了分字段和聚合函数的结果;
如果存在 GROUP BY 子句,可以利用 HAVING 针对分组后的结果进一步进行过滤,通常是针对聚合函数的结果进行过滤;
接下来,SELECT 可以指定要返回的列;如果指定了 DISTINCT 关键字,需要对结果集进行去重操作。另外还会指定了 AS 的字段生成别名;
如果还有集合操作符(UNION、INTERSECT、EXCEPT)和其他的 SELECT 语句,执行该查询并且合并两个结果集。对于集合操作中的多个 SELECT 语句,数据库通常可以支持并发执行;
然后,应用 ORDER BY 子句对结果进行排序。如果存在 GROUP BY 子句或者 DISTINCT 关键字,只能使用分组字段和聚合函数进行排序;否则,可以使用 FROM 和 JOIN 表中的任何字段排序;
后,OFFSET 和 FETCH(LIMIT、TOP)限定了终返回的行数。
了解 SQL 逻辑执行顺序可以帮助我们进行选择 SQL 优化。
东莞网站/软件服务相关信息
2023-09-15
注册时间:2021年07月02日
UID:725737
---------- 认证信息 ----------
手机已认证
查看用户主页