非最左邊的列MAX查詢優化SQLite的,我注意到網上關於頁面SQLite's query optimizer保證形式SELECT MAX(colA) FROM TABLE
的查詢可以,如果有一個指標,其最左邊一列是colA
進行優化。對指數
但是,我不太清楚使用索引來根據WHERE
子句中的等式來縮小表的情況,以便索引中的下一列是我在MAX
上的那一列。根據索引的結構,最大值應該可以快速訪問,作爲索引子集中滿足WHERE
子句的最後一行。例如,鑑於colA
和colB
指數,應該可以找到SELECT MAX(colB) FROM SillyTable WHERE colA = 1
不掃描與colA = 1
相關聯的所有6行:
Index of SillyTable on colA, colB:
colA colB rowid
1 1 4
1 2 5
1 4 2
1 5 8
1 6 3 # This is the one
2 1 1
2 5 6
2 8 7
不SQLite的實際優化這樣的查詢,還是會掃描所有的行滿足WHERE
條款?如果它執行掃描,我如何更改查詢以使其運行更快?
我的具體使用案例與SillyTable
示例類似。我創建了以下表格:
CREATE TABLE Product(
ProductTypeID INTEGER NOT NULL,
ProductID INTEGER NOT NULL,
PRIMARY KEY(ProductTypeID, ProductID),
FOREIGN KEY(ProductTypeID)
REFERENCES ProductType(ProductTypeID)
);
ProductTypeID
對錶格並不是特別有選擇性的;我可能有許多行與ProductTypeID
相同但不同的ProductID
。 EXPLAIN QUERY PLAN
告訴我,我的查詢使用了複合主鍵會自動建立索引,但無論掃描或二進制搜索行與索引中找到的子集,這是真的:
EXPLAIN QUERY PLAN SELECT MAX(ProductID) FROM Product
WHERE ProductTypeID = ?;
=>
SEARCH TABLE Product USING COVERING INDEX sqlite_autoindex_Product_1(ProductTypeID=?)