用ORDER BY覆盖索引

时间:2015-10-06 21:18:45

标签: mysql sql sql-server database oracle

如果您有复合聚簇索引,请说:rssItemsArrayAdapter.notifyDataSetChanged(); 。 (所有字段都是非空的)

鉴于查询:

(ClientId, Date, OrderId, ProductId)

此查询是否会通过SELECT * FROM products WHERE ClientId = 33 AND OrderId = 4 AND ProductId = 2 ORDER BY Date完全利用覆盖索引,还是要求ORDER BY Date字段位于WHERE子句中?

我添加了主数据库引擎的标签,以防每个引擎之间存在差异。

4 个答案:

答案 0 :(得分:1)

对于MySQL,您的索引无法使用。 MySQL的索引适用于left-> right:

(ClientId, Date, OrderId, ProductId)

由于您的查询仅涉及ClientIDProductID,因此无法使用索引 - 您必须在查询中使用包含DateOrderID好。请注意,查询中字段的特定顺序是无关紧要的 - 它是否被用作所有重要的字段:

因此,如果您的查询where有:

clientid                     -> usable
clientid, date               -> usable
date, clientid               -> usable, order of usage irrelevant
clientid, orderid            -> not usable, missing date
clientid, orderid, productid -> also not usable, missing date
clientid, productid          -> not usable, missing orderid, missing date
date                         -> not usable missing clientid

请注意,这仅适用于mysql。其他一些数据库系统没有这个限制。

答案 1 :(得分:0)

这实际上取决于许多事情,比如

  • 表中有多少行?
  • 从索引页获取值需要多长时间?
  • 你从*获得的内容是什么......

这就是为什么他们发明了“解释计划”

想要了解时使用

答案 2 :(得分:0)

为了添加讨论,我实际上在搜索堆栈10分钟后找到答案(由于涉及通用术语而很难找到)。似乎这个答案:Proper field orders for covering index - MySQL

表示对于MySQL SELECT WHERE GROUP BY HAVING ORDER BY都是有效的引用。

我想知道MSSQL和Oracle是否也是如此

答案 3 :(得分:0)

将索引中的列重新排序为ClientId,OrderId,ProductId,Date

然后将使用索引。

不,订单不会有助于使用索引。 但是通过使用索引可以帮助订购,

如果可接受,您可以更改订单 ORDER BY ClientId,OrderId,ProductId,Date然后它将使用相同的索引

或者,如果您没有更改索引中列的顺序,那么您可以将订单更改为ORDER BY ClientId,Date和将使用索引