返回

MySQL 查询优化:循序渐进的指南,显著提升性能

java

优化 MySQL 查询语句以提高性能

引言

数据库查询是现代应用程序中的核心操作之一。优化查询对于提高应用程序的性能和用户体验至关重要。本文将指导你完成优化 MySQL 查询语句的步骤,提供实用的技巧和示例来帮助你提高查询速度。

1. 识别优化点

索引:

索引是提高查询性能的关键。在表中创建适当的索引可以大大减少查询需要扫描的数据量。考虑在经常用于 WHERE 子句中的列上创建索引,例如 Person 和 CardNumber 列。

WHERE 子句:

WHERE 子句中的条件可以重写为更有效的形式。例如,可以使用 BETWEEN 操作符来替换条件 LEN(CardNumber) BETWEEN 0 AND 9。

2. 优化 WHERE 子句

  • 将条件 Person LIKE '% %' 重写为 Person LIKE '% %',因为空格字符在 LIKE 操作符中被视为通配符。
  • 使用 BETWEEN 操作符来替换条件 LEN(CardNumber) BETWEEN 0 AND 9:BETWEEN 0 AND 9。
  • 将条件 convert(datetime, Uhrzeit, 101) > getdate() -92 重写为 Uhrzeit > DATEADD(minute, -92, GETDATE()):Uhrzeit > DATEADD(minute, -92, GETDATE())。

3. 添加索引

  • 在 Person 列上创建索引:CREATE INDEX IX_sist_zlog_Person ON sist_zlog (Person)。
  • 在 CardNumber 列上创建索引:CREATE INDEX IX_sist_zlog_CardNumber ON sist_zlog (CardNumber)。

4. 优化查询示例

优化后的查询语句如下:

SELECT
    TOP 20000 id AS RecordId,
    'Access Granted' AS Event_Description,
    'Access Granted' AS Event_Type,
    SUBSTRING(
        Person,
        CHARINDEX(' ', Person) + 1,
        CHARINDEX(' ', Person, CHARINDEX(' ', Person) + 1) - CHARINDEX(' ', Person) - 1
    ) AS UserId,
    c.DATA_20_Name_NA AS FirstName,
    c.DATA_20_Surname_NA AS LastName,
    CASE
        WHEN LEN(CardNumber) BETWEEN 10 AND 9 THEN REPLACE(STR(CardNumber, 10), ' ', '0')
        WHEN LEN(CardNumber) = 14 THEN SUBSTRING(
            RIGHT(CardNumber, LEN(CardNumber) - 3),
            1,
            LEN(RIGHT(CardNumber, LEN(CardNumber) - 3)) - 1
        )
        ELSE CardNumber
    END AS BadgeId,
    CONVERT(DATETIME, Uhrzeit, 121) AS eventTime,
    CONVERT(
        DATETIME,
        DATEADD(
            MINUTE,
            DATEDIFF(MINUTE, GETDATE(), GETUTCDATE()),
            Uhrzeit
        ),
        121
    ) AS eventTimeUTC,
    RTRIM(Ort) AS ReaderName
FROM
    sist_zlog events
    INNER JOIN CARDHOLDER c ON SUBSTRING(
        Person,
        CHARINDEX(' ', Person) + 1,
        CHARINDEX(' ', Person, CHARINDEX(' ', Person) + 1) - CHARINDEX(' ', Person) - 1
    ) = c.DATA_20_Person_no_PN
WHERE
    Person LIKE '% %'
    AND id > 0
    AND Uhrzeit > DATEADD(MINUTE, -92, GETDATE())
ORDER BY
    id ASC;

结论

通过遵循这些步骤,你可以显著提高 MySQL 查询语句的性能。通过优化 WHERE 子句、创建索引并使用适当的技术,你可以减少查询时间,提高应用程序的整体响应能力。

常见问题解答

  1. 什么是索引?
    索引是表中一个特殊的数据结构,用于快速查找数据。索引类似于书中的目录,它允许数据库快速定位特定记录,而无需扫描整个表。

  2. 如何知道是否需要创建索引?
    如果你的查询需要经常扫描大量数据,并且 WHERE 子句中的条件涉及特定列,则可能需要创建索引。

  3. 如何优化 WHERE 子句?
    优化 WHERE 子句的一个常见技术是使用 BETWEEN 操作符来替换范围条件。此外,将字符串常量用作 LIKE 操作符的参数时,请使用通配符 (%) 来提高性能。

  4. 为什么创建多个索引可能是有害的?
    创建不必要的索引会降低数据库性能,因为索引需要维护并会占用磁盘空间。只有在实际需要提高查询速度的情况下才创建索引。

  5. 除了优化查询之外,还有什么其他方法可以提高 MySQL 性能?
    还有许多其他方法可以提高 MySQL 性能,例如优化数据库架构、调整服务器设置和使用查询缓存。