sql - 在 ORDER BY 子句中使用索引

标签 sql database performance sql-execution-plan

我已阅读 Indexing Order By “SQL Performance Explained”一书的部分。我对此有一些疑问。假设我们在 (a, b, c) 上有一个复合索引。我的理解正确吗?

  1. SELECT * FROM tbl WHERE a = ?和 b = ?和 c = ? ORDER BY a, b, c:将为WHEREORDER BY
  2. 使用索引
  3. SELECT * FROM tbl WHERE a = ? ORDER BY b:将为 WHEREORDER BY
  4. 使用索引
  5. SELECT * FROM tbl WHERE a = ? ORDER BY c:将为WHERE 使用索引,但NOT 将为ORDER BY
  6. 使用索引
  7. SELECT * FROM tbl WHERE a = ?和 b = ? ORDER BY c:将为 WHEREORDER BY
  8. 使用索引
  9. SELECT * FROM tbl WHERE b = ?和 c = ? ORDER BY a:将将索引用于WHERE,但将其用于ORDER BY
  10. SELECT * FROM tbl WHERE a = ?和 c = ? ORDER BY b:我不知道这个。请帮忙。
  11. SELECT * FROM tbl WHERE c = ? ORDER BY b:将WHEREORDER BY
  12. 使用索引

最佳答案

一些数据库有额外的索引使用,但一般来说,前 4 个和最后一个是正确的。

第(5)项取决于引擎和数据的特性。有两种方法可以处理这个查询:

  • 选择正确的行并对其进行排序。
  • 读取有序数据,然后进行过滤。

第二个使用索引,第一个不使用。

项目 (6)。典型的引擎会针对 a 上的条件有效地使用索引。之后会发生什么取决于引擎。这类似于 (5) 的情况,其中引擎可以使用索引进行排序,但也可以先进行过滤。

顺便说一句,只选择 a、b 和 c 而不是 * 可能会影响 (5) 和 (6) 的优化选项。

关于sql - 在 ORDER BY 子句中使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25572026/

相关文章:

c# - 从文本框名称创建表格时语法不正确

java - 如何搜索字段的频繁出现模式

MySQL:如果存在则选择最新记录,如果不存在则为NULL

sql - 如何开始一个 DBMS 项目

java - 兰特流的高性能缓冲

javascript - 报告所有使用的 Javascript 函数

sql - 奇怪的SQL Server查询问题

mysql - 为单行关系创建关系表?

c++ - 在 C++ 中更快地浏览 csv 文件的方法

python - mongo 查询不返回结果