在ORDER BY子句中使用索引

时间:2014-08-29 16:04:40

标签: sql database performance sql-execution-plan

我已阅读" SQL Performance Explained"的Indexing Order By部分书。我有一些问题。考虑我们在(a, b, c)上有一个复合索引。我的理解是否正确?

  1. SELECT * FROM tbl WHERE a = ? AND b = ? AND 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的索引,但使用ORDER BY的索引
  6. SELECT * FROM tbl WHERE a = ? AND b = ? ORDER BY c:将使用WHEREORDER BY
  7. 的索引
  8. SELECT * FROM tbl WHERE b = ? AND c = ? ORDER BY a会使用WHERE的索引,但会将其用于ORDER BY
  9. SELECT * FROM tbl WHERE a = ? AND c = ? ORDER BY b:我不知道这一点。请帮忙。
  10. SELECT * FROM tbl WHERE c = ? ORDER BY b使用WHERE的索引和ORDER BY

1 个答案:

答案 0 :(得分:4)

某些数据库有额外的索引用法,但一般情况下,前4个和最后一个数据库都是正确的。

项目(5)取决于引擎和数据的特征。有两种方法可以处理此查询:

  • 选择正确的行并订购。
  • 仔细阅读有序数据,然后进行过滤。

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

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

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