情景1:
我在(OrderDate, Country, OrderStatus
)
我想如果我按OrderDate
,OrderDate/Country
或OrderDate/Country/Status
进行搜索,则可以使用该索引。如果我只是通过OrderDate/OrderStatus
或OrderStatus
进行搜索,那该怎么办?
情景2:
我在OrderDate
,Country
和OrderStatus
如果我的查询涉及所有3个列,那么它可以利用所有3个索引吗?我的意思是,在使用它选择的最佳索引进行过滤后,是否可以利用其他2个索引?
此信息将帮助我不要过度实施索引。
由于
ETA:只是要添加,这是针对具有约30种不同过滤器的典型订单搜索页面。
答案 0 :(得分:2)
对场景1的回答实际上比这更复杂。
它也归结为从搜索'中选择的内容。以及数据如何在表中分发。但是看到这是101,我不会深入其中。
基本上 - 如果您选择索引中包含的列,首先使用OrderDate
,并且只选择索引中包含的列(表示索引和包含列中的列),它将使用索引您指定并且它应该能够执行seek
(查找数据的最快方法,因为它可以通过索引寻找正确的叶节点)
如果您SELECT *
或以其他方式选择了许多不在索引中的列,而首先使用OrderDate
,那么它可能不会使用您的索引,因为其他索引更好 - 或者根据数据,它会对您的索引执行seek
,并结合键查找。
这就是它可以变得更复杂的地方,但是我无法记住我头顶的确切数字。
如果您选择使用OrderStatus
,那么取决于您实际选择的内容,您可以使用或不使用索引。但是当使用索引时它会scan
因为它无法寻找它
(扫描意味着遍历索引中的每个叶节点)
再次 - 如果选择的数据不是来自索引,它可能与键查找相结合以获取未包含在索引中的数据。
我希望这对方案1有所帮助。否则我会建议您转到https://dba.stackexchange.com/以获取更多与数据库相关的受众。
至于你如何提及你的场景2;那么简短的回答是,如果你的查询涉及所有3个索引,那么除非你的查询是使用联合或其他临时结构(公共表表达式等)构建的,否则它将不会利用所有3个索引。
可能优化器可能会将索引的查询连接在一起,但更多 通常情况下,您更有可能仅使用一个索引来查看它。