如果您有复合聚簇索引,请说: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子句中?
我添加了主数据库引擎的标签,以防每个引擎之间存在差异。
答案 0 :(得分:1)
对于MySQL,您的索引无法使用。 MySQL的索引适用于left-> right:
(ClientId, Date, OrderId, ProductId)
由于您的查询仅涉及ClientID
和ProductID
,因此无法使用索引 - 您必须在查询中使用包含Date
和OrderID
好。请注意,查询中字段的特定顺序是无关紧要的 - 它是否被用作所有重要的字段:
因此,如果您的查询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和将使用索引