2013-10-15 208 views
3

PRIMARY KEY(col1, col2)sqlite中的複合主鍵

創建一個名爲「sqlite_autoindex_mytable_1」的索引。我在「SQlite Expert」中看到它。在「字段索引」框中,它顯示col1和col2。

在這篇文章中: https://dba.stackexchange.com/a/14260 它說我必須爲col2創建單獨的索引,如果我想在沒有col1的JOIN查詢中使用col2。

所以我需要添加:

CREATE INDEX "myidx" ON "mytable"("col2");

如果我有這個疑問:

SELECT t2.* FROM mytable as t1 
INNER JOIN mytable2 as t2 ON t1.col2 = t2.id 

我仍然需要一個COL2指數?我沒有在其中使用col1

並且怎麼樣這個查詢:

SELECT t2.* FROM mytable as t1 
INNER JOIN mytable2 as t2 ON t1.col2 = t2.id WHERE t1.col1 = x 

這裏我使用COL1,但where子句。它是否仍然需要col2索引?

回答

4
  • SQLite中,連接被實現爲嵌套循環聯接,即SQLite的穿過所有(也許過濾)一個表中的記錄,併爲每一個,查找在其他的匹配結果表。兩個連接表中的哪一個被選作外部或內部表取決於哪個查找估計會更快。
  • 在查詢中,SQLite每個表最多使用一個索引。
  • 只有在使用了所有最左邊的列時,纔可以使用多列索引在其列的子集上進行查找。 例如,您的col1,col2索引可用於同時使用col1col2的查找,也可用於僅使用col1的查找。

在您的第一個查詢中,兩列索引不能用於col2上的查找。 如果另一個表的列id有索引,SQLite將只使用該表作爲循環的內部表。如果id也沒有索引,SQLite可能會爲此查詢創建一個臨時索引。

在第二個查詢中,SQLite可能使用t1作爲外部表,因爲WHERE過濾器將減少必須在另一個表中查找的記錄數。兩列索引可用於首先搜索匹配的col1記錄;那麼這些記錄中的每一個都與t2聯合。

要檢查查詢使用了哪些索引(如果有),請執行EXPLAIN QUERY PLAN

1

您最好始終在需要的列上創建一個explict索引。

複合索引可能會加速單列搜索,但必須滿足requirements

+0

您沒有回答索引是否需要。至少提到[EXPLAIN QUERY PLAN](http://www.sqlite.org/eqp.html)。 –

+0

@CL。更好地查詢,我也不確定!你能寫出自己的答案嗎? –