我已阅读 Indexing Order By “SQL Performance Explained”一书的部分。我对此有一些疑问。假设我们在 (a, b, c)
上有一个复合索引。我的理解正确吗?
SELECT * FROM tbl WHERE a = ?和 b = ?和 c = ? ORDER BY a, b, c
:将为WHERE
和ORDER BY
使用索引
SELECT * FROM tbl WHERE a = ? ORDER BY b
:将为WHERE
和ORDER BY
使用索引
SELECT * FROM tbl WHERE a = ? ORDER BY c
:将为WHERE
使用索引,但NOT 将为ORDER BY
使用索引
SELECT * FROM tbl WHERE a = ?和 b = ? ORDER BY c
:将为WHERE
和ORDER BY
使用索引
SELECT * FROM tbl WHERE b = ?和 c = ? ORDER BY a
:将不将索引用于WHERE
,但将其用于ORDER BY
SELECT * FROM tbl WHERE a = ?和 c = ? ORDER BY b
:我不知道这个。请帮忙。SELECT * FROM tbl WHERE c = ? ORDER BY b
:将不为WHERE
和ORDER BY
使用索引
最佳答案
一些数据库有额外的索引使用,但一般来说,前 4 个和最后一个是正确的。
第(5)项取决于引擎和数据的特性。有两种方法可以处理这个查询:
- 选择正确的行并对其进行排序。
- 读取有序数据,然后进行过滤。
第二个使用索引,第一个不使用。
项目 (6)。典型的引擎会针对 a
上的条件有效地使用索引。之后会发生什么取决于引擎。这类似于 (5) 的情况,其中引擎可以使用索引进行排序,但也可以先进行过滤。
顺便说一句,只选择 a、b 和 c 而不是 *
可能会影响 (5) 和 (6) 的优化选项。
关于sql - 在 ORDER BY 子句中使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25572026/