假設我在 SQLite 資料庫中有一個表:
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
price INTEGER NOT NULL,
updateTime INTEGER NOT NULL,
) [WITHOUT ROWID];
我應該創建哪些索引來優化以下查詢:
SELECT * FROM orders WHERE price > ? ORDER BY updateTime DESC;
我是否創建兩個索引:
CREATE INDEX i_1 ON orders(price);
CREATE INDEX i_2 ON orders(updateTime);
還是一個復雜的索引?
CREATE INDEX i_3 ON orders(price, updateTime);
查詢時間復雜度是多少?
uj5u.com熱心網友回復:
來自SQLite 查詢優化器概述/WHERE 子句分析:
如果使用如下陳述句創建索引:
CREATE INDEX idx_ex1 ON ex1(a,b,c,d,e,...,y,z);然后, 如果索引的初始列(列 a、b 等)出現在 WHERE 子句術語中,則可以使用該索引。索引的初始列必須與 = 或 IN 或 IS 運算子一起使用。使用的最右邊的列可以使用不等式。
正如SQLite 查詢優化器概述/跳過掃描優化中的示例所解釋的:
因為索引的最左邊的列沒有出現在查詢的 WHERE 子句中,所以很容易得出索引在這里不可用的結論。但是,SQLite 能夠使用索引。
這意味著如果您創建如下索引:
CREATE INDEX idx_orders ON orders(updateTime, price);
即使沒有出現在那里,它也可能用于優化子句。WHEREupdateTime
此外,來自SQLite 查詢優化器概述/ORDER BY 優化:
SQLite 盡可能使用索引來滿足查詢的 ORDER BY 子句。當面臨使用索引來滿足 WHERE 子句約束或滿足 ORDER BY 子句的選擇時,SQLite 會執行上述相同的成本分析,并選擇它認為會產生最快答案的索引。
由于updateTime是在復合索引中首先定義的,因此該索引也可用于優化ORDER BY子句。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/430515.html
標籤:sqlite 索引 sql-order-by 查询优化 where子句
上一篇:如何將值插入表列?[復制]
