带有覆盖索引超时的简单 SQL 查询

问题描述 投票:0回答:1

我有一个愚蠢的简单查询,它使用完全覆盖索引,但查询经常超时,而其他时候,会立即返回完全相同的查询的结果。 该表有近 300 万行,托管在 Azure SQL S3 DB 中。

enter image description here

这是索引。

enter image description here

我被难住了。 有什么推荐吗?

sql-server azure
1个回答
0
投票

如果使用覆盖索引的简单 SQL 查询超时,则可能有多种原因导致发生这种情况,尽管覆盖索引通常用于优化性能。以下是一些常见原因和解决问题的解决方案:

1。检查查询计划和索引使用情况

即使索引存在,也可能无法有效使用。对查询运行 EXPLAIN 或 EXPLAIN ANALYZE(取决于 RDBMS)以查看索引是否实际被使用。如果未使用索引,您可能需要:

  1. 验证查询条件是否与索引列匹配。

  2. 确保索引针对查询进行了适当排序。

解释 SELECT * FROM your_table WHERE your_condition;

2。统计数据已过时

如果数据库的统计信息已过时,查询优化器可能会做出错误的决策,例如不使用索引或错误计算行估计。更新您表的统计数据。

PostgreSQL 中的示例:

分析你的_表;

MySQL 中的示例:

分析表 your_table;

3.低效的查询或函数

确保查询中没有任何函数(例如 LOWER()、SUBSTR() 等)应用于索引条件中使用的列。函数可以阻止使用索引。

示例:

从 your_table 中选择 * WHERE LOWER(column) = 'value';

可能不会在列上使用索引。相反,请确保以标准化格式存储值。

4。基数和索引选择性

如果覆盖索引中的列基数较低(许多重复值),则索引可能无法提供显着的性能改进,从而导致超时。在这种情况下,向索引添加更具体的列或使用复合索引可能会有所帮助。

示例:

在 your_table(col1, col2) 上创建索引 idx_col1_col2;

5。数据量大

如果数据集非常大,即使有覆盖索引,查询仍然可能超时。提高性能:

  • 限制数据:尝试使用 LIMIT 或更多来减少数据集 选择性过滤器。

  • 分区: 如果您的数据库支持,则对表进行分区 可以帮助优化大型数据集的查询。

示例:

SELECT * FROM your_table WHERE 条件 LIMIT 1000;

6。索引碎片

随着时间的推移,索引可能会变得碎片化,从而降低查询性能。考虑重建索引以提高其性能。

PostgreSQL 中的示例:

REINDEX 索引 idx_your_table;

MySQL 中的示例:

优化表 your_table;

7。数据库锁定问题

如果表上存在其他长时间运行的事务或锁定问题,这可能会导致您的查询等待,最终超时。检查锁定问题和长时间运行的事务:

  • PostgreSQL: 检查 pg_stat_activity 和 pg_locks。
  • MySQL:使用 SHOW PROCESSLIST;SHOW ENGINE INNODB STATUS;.
  • 检查

8。磁盘 I/O 瓶颈

如果您的服务器遇到 I/O 瓶颈,即使是简单的查询也可能会超时。监视数据库服务器上的磁盘使用情况和 I/O 性能。 iostattop 等工具或特定于数据库的监控工具可以帮助识别 I/O 问题。

通过执行这些步骤,您应该能够识别查询超时的根本原因并进行相应的优化。首先检查查询执行计划、更新统计信息并检查潜在瓶颈,例如锁定或低效查询。

© www.soinside.com 2019 - 2024. All rights reserved.