优化 SQL 查询以提高性能的 12 个技巧

2024年 5月 7日 59.6k 0

-1

优化 SQL 查询的方法

在当今数据驱动的世界中,数据库应用程序已成为许多企业的重要组成部分。随着越来越多的公司选择在云中处理和存储数据,优化查询对于公司的盈利来说变得比以往任何时候都更加重要。我们将在本文中研究一些加速 SQL 查询性能的有效技术。有多种方法可以优化 SQL 查询以获得更快的性能,下面将对此进行讨论。

1. 尽量减少通配符的使用

在 SQL 查询中使用通配符(例如 % 和 _)会降低查询性能。当使用通配符时,数据库必须扫描整个表才能找到相关数据。为了优化 SQL 查询,尽量减少通配符的使用并仅在绝对必要时使用它们非常重要。例如,让我们考虑一个查询,用于查找城市姓氏以字母“P”开头的所有客户。以下查询使用通配符来查找所有匹配的记录:

SELECT * FROM customers WHERE last_name_city LIKE 'P%';

此查询可以工作,但会比在 last_name_city 列上使用索引的查询慢。可以通过向last_name_city列添加索引并重写如下来改进查询:

SELECT * FROM customers WHERE last_name_city >= 'P' AND last_name < 'Q';

此查询将使用姓氏列上的索引,并且比上一个查询更快。

2. 使用索引提高查询性能

使用索引可以加速 SQL 查询,索引使数据库能够快速找到符合特定条件的条目。索引是将表中一列或多列的值映射到唯一值的过程,以便轻松搜索与特定值或值范围匹配的行。为了增强SQL 查询,您可以在 WHERE、JOIN 和 ORDER BY 子句中经常使用的列上创建索引。但是,创建太多索引会减慢数据修改操作(例如 INSERT、UPDATE 和 DELETE)。在决定对哪些列建立索引以及使用哪些类型的索引时,请考虑读取性能和写入性能之间的权衡。使用以下查询查找特定客户发出的所有订单:

SELECT * FROM orders WHERE customer_number = 2154;

由于数据库必须在整个表中搜索与客户编号匹配的条目,因此如果订单表包含大量记录,则此查询可能需要很长时间。您可以在 customer_number 列上创建索引来改进查询:

CREATE INDEX idx_orders_customer_number ON orders (customer_id);

这会在订单表的 customer_number 列上创建索引。现在,当您运行查询时,数据库可以使用索引快速定位到与客户编号匹配的行,这可以提高查询性能。

3. 使用适当的数据类型

对数据库中的列使用适当的数据类型可以显着提高查询性能。例如,对包含数值的列使用整数数据类型可以使查询比使用文本数据类型运行得更快。使用正确的数据类型还可以确保数据完整性并可以防止数据转换错误。让我们考虑一下,我们有一个表,其中每行代表零售商店的订单详细信息。该表包含订单 ID、客户 ID、订单日期和订单总计列。订单总计列包含数值。如果订单总计列存储为文本数据类型,则对订单总计执行计算的查询将比该列存储为数字数据类型时慢。

4.避免子查询

子查询会降低查询性能,尤其是在 WHERE 或 HAVING 子句中使用时。尽可能避免子查询并改用 JOIN 或其他技术非常重要。例如,考虑一个查询,该查询查找过去 30 天内下过订单的所有客户。以下查询使用子查询查找过去 30 天内的所有订单 ID:

SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -30, GETDATE()));

此查询可以工作,但会比使用 JOIN 查找相关数据的查询慢。以下查询使用 JOIN 查找过去 30 天内下过订单的所有客户:

SELECT DISTINCT c.* FROM customers c JOIN orders o ON c.customer_id = o.customer_id WHERE o.order_date >= DATEADD(day, -30, GETDATE());

此查询将客户表与订单表连接起来,并检索过去 30 天内下过订单的所有客户信息。此查询将比前一个查询更快,因为它避免使用子查询。

5.使用LIMIT或TOP限制返回的行数

必须使用LIMIT或 TOP 子句来限制 SQL 查询中返回的行数。因此,需要处理和返回的数据将会减少。例如,考虑一个查询来查找过去 27 天内下过订单的所有客户。如果过去 27 天内有大量客户下了订单,则查询可能会返回大量行。这可以使用 LIMIT 或 TOP 进行优化。以下查询将返回的行数限制为 10:

SELECT TOP 10 * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -27, GETDATE()));

该查询将仅返回符合条件的前 10 行,这将提高查询性能。

6.避免使用SELECT *

使用 SELECT * 语句会降低查询性能,因为它返回表中的所有列,包括查询不需要的列。为了优化 SQL 查询,仅选择查询所需的列非常重要。例如,考虑一个查询来查找过去 30 天内下过订单的所有客户。以下查询从客户表中选择所有列:

SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -30, GETDATE()));

为了优化查询,可以修改 SELECT 语句以仅选择需要的列:

SELECT customer_id, first_name, last_name FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -30, GETDATE()));

此查询将仅选择客户 ID、名字和姓氏列,这将提高查询性能。

7. 使用 EXISTS 代替 IN

使用 IN 运算符将值与子查询返回的值列表进行比较。但是,使用 IN 会降低查询性能,因为它需要数据库对子查询执行全表扫描。要优化 SQL 查询,可以使用 EXISTS 运算符而不是 IN。例如,考虑一个查询来查找过去 30 天内下过订单的所有客户:

SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE order_date >= DATEADD(day, -30, GETDATE()));

此查询使用 IN 将客户 ID 与子查询返回的客户 ID 列表进行比较。要优化查询,可以使用 EXISTS 而不是 IN:

SELECT * FROM customers c WHERE EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id AND o.order_date >= DATEADD(day, -30, GETDATE()));

此查询使用 EXISTS 来检查订单表中是否存在匹配的行,而不是使用 IN。这可以通过避免全表扫描来提高查询性能。

8.使用GROUP BY对数据进行分组

它用于根据一列或多列对行进行分组。这对于汇总数据或对数据组执行聚合函数非常有用。但是,如果不必要地使用GROUP BY可能会降低查询性能。为了优化 SQL 查询,您应该仅在必要时使用 GROUP BY。例如,考虑一个查询来查找每个客户下的订单总数:

SELECT customer_id, COUNT(*) as order_count FROM orders GROUP BY customer_id;

此查询使用 GROUP BY 按客户 ID 对行进行分组,并计算每个客户下的订单数。要优化查询,您可以使用子查询来检索客户信息并将其与订单表连接:

SELECT c.customer_id, c.first_name, c.last_name, o.order_count FROM customers c JOIN (SELECT customer_id, COUNT(*) as order_count FROM orders GROUP BY customer_id) o ON c.customer_id = o.customer_id;

此查询使用子查询来计算每个客户下的订单数,然后将结果与客户表连接以检索客户信息。这样可以避免使用 GROUP BY 并可以提高查询性能

9.使用存储过程

存储过程是存储在数据库中的预编译的 SQL 语句。可以从应用程序或直接从 SQL 查询调用它们。使用存储过程可以通过减少数据库和应用程序之间发送的数据量以及减少编译和执行 SQL 语句所需的时间来提高查询性能。

10.优化数据库设计

优化数据库设计还可以提高查询性能。这包括确保表正确规范化以及有效使用索引。此外,确保数据库针对预期工作负载进行适当调整并配置为适当的并发级别也很重要。

11.使用查询优化工具

有多种查询优化工具可以帮助识别 SQL 查询中的性能问题。这些工具可以提供提高查询性能的建议,例如创建索引、重写查询或优化数据库设计。一些流行的查询优化工具包括 Microsoft SQL Server 查询优化器、Oracle SQL Developer 和 MySQL 查询优化器。

12. 监控查询性能

监控查询性能是优化 SQL 查询的重要一步。通过监控查询性能,可以识别性能问题并做出适当的调整。这可以包括优化索引、重写查询或调整数据库设计。为了跟踪查询性能,可以使用许多工具,包括 SQL Server Profiler、Oracle Enterprise Manager 和 MySQL Enterprise Monitor。

结论

优化 SQL 查询以获得更快的性能是确保数据库应用程序高效运行的重要一步。通过这篇文章,我们可以总结出以下几点——

  1. 索引是提高 SQL 查询性能的最有效技术,但在决定对哪些列建立索引以及使用哪种类型的索引时,请仔细考虑读取性能和写入性能之间的权衡。
  2. 优化 SQL 查询是一个持续的过程,需要定期监控和调整以确保持续的性能改进。
  3. 必须尽量减少使用昂贵的操作,例如 JOIN、GROUP BY、IN 和子查询,以提高性能。
  4. 在实际数据集上测试查询,以确保优化达到预期效果。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论