在本文中,我们将讨论如何提高SQL查询速度的同时,还能保持SQL语句的简洁。
在进入主题之前,我们先了解一下查询的实际处理过程:
查询处理过程被定义为通过一系列从数据库中提取数据的过程。这涉及将SQL语句的转换为数据库可以理解的形式,并查询出最终的结果。
查询处理涉及三个主要步骤:
SQL 查询优化被定义为在执行时间、磁盘访问次数以及更多成本之间增强和加速查询性能的过程。应以尽可能最快的方式访问数据,以增强用户使用应用程序时的体验。
SQL查询优化的目的:
仅从表中获取必要的数据,而不是获取所有数据。
比如:
SELECT * FROM Business
更高效的查询写法是:
SELECT name , age , gender FROM Business
这个查询要简单得多,只从表中提取所需的详细信息。
SELECT DISTINCT 是从数据库中删除重复项的简单方法,也可以通过和 GROUP BY 子句来生成不同的结果,该子句对查询中的所有字段进行分组。然而,要做到这一点需要消耗大量的处理能力。因此,在 SELECT 查询中避免DISTINCT。
正确的使用索引可以减少常用语句的执行时间。
比如:
CREATE INDEX index_optimizer ON Business(id);
EXISTS() 和 COUNT() 方法都可以用来检查表中记录条目的存在。
EXISTS() 方法更有效,因为一旦找到表中记录的第一个条目,它就会退出处理。
COUNT() 方法将扫描整个表以返回表中与所提供的约束匹配的记录数。
比如:
SELECT count(id) FROM Business
更有效的写法是:
EXISTS (SELECT (id) FROM Business)
检索的数据越少,查询运行的速度就越快。
HAVING 子句在选择所有行后过滤行。
HAVING 语句在 SQL 操作中确定顺序在 WHERE 语句之后。因此,执行 WHERE 查询会更快。
比如:
SELECT c.ID, c.CompanyName, b.CreatedDate FROM Business b
JOIN Company c ON b.CompanyID = c.ID
GROUP BY c.ID, c.CompanyName, b.CreatedDate
HAVING b.CreatedDate BETWEEN ‘2020-01-01’ AND ‘2020-12-31’
更有效的写法:
SELECT c.ID, c.CompanyName, b.CreatedDate FROM Business b
JOIN Company c ON b.CompanyID = c.ID
WHERE b.CreatedDate BETWEEN ‘2020-01-01’ AND ‘2020-12-31’
GROUP BY c.ID, c.CompanyName, b.CreatedDate
3.7 忽略链接子查询
链接子查询取决于来自父级或外部源的查询。它是逐行运行的,因此平均循环速度受到很大影响。
比如:
SELECT b.Name, b.Phone, b.Address, b.Zip, (SELECT CompanyName FROM Company WHERE ID = b.CompanyID) AS CompanyName FROM Business b
对于外部查询返回的每一行,每次都会运行内部查询。或者,可以使用 JOIN 来解决 SQL 数据库优化的这些问题。
SELECT b.Name, b.Phone, b.Address, b.Zip, c. CompanyName FROM Business b
Join Company c ON b.CompanyID = c.ID
在本文中,我们介绍了优化 SQL 查询的一些技巧。通常,对查询速度产生最大影响的因素是正确使用索引。希望本文中的内容能帮助到你。