【发布时间】:2016-01-03 23:00:41
【问题描述】:
如果您有复合聚集索引,请说:(ClientId, Date, OrderId, ProductId)。 (所有字段都不为空)
给定查询:
SELECT * FROM products WHERE ClientId = 33 AND OrderId = 4 AND ProductId = 2 ORDER BY Date
此查询是否会通过 ORDER BY Date 充分利用覆盖索引,还是要求 Date 字段位于 WHERE 子句中?
我添加了主要数据库引擎的标签,以防每个引擎之间存在差异。
【问题讨论】:
-
覆盖索引意味着查询中的所有列(包括
Select子句中的列)都在索引中。因此,Date列也需要在索引中。顺便说一句:如果一个人看到这个查询和索引定义,他们不会知道它是否是一个覆盖查询。如果您使用Select ClientId, OrderId, ...而不是Select * ...会更清楚——这被广泛认为是生产代码的最佳实践。
标签: mysql sql sql-server database oracle