2012-02-02 164 views
1

我目前有兩個名爲「名稱」和「帳戶」的表。我需要選擇帳戶已啓用的所有名稱。所以我可以通過兩種方法做到這一點,但我想知道哪種方法更快更高效?哪種查詢更高效?

第一種方式是選擇所有啓用的帳戶,然後在一個單獨的查詢有一個地方可以使用這些帳戶條款(僞):

SELECT account_id FROM accounts WHERE enabled=1; 

然後

SELECT * FROM names WHERE account_id IN (account_id_list); 

或者我可以做一個簡單的加入表格:

SELECT * FROM names JOIN accounts USING account_id WHERE enabled=1; 

名稱表將約10-25k行,將a也可以使用SQLite在移動設備(Android)上運行。

謝謝!

+1

使用命令'EXPLAIN Q UERY PLAN'並找出:http://www.sqlite.org/eqp.html – 2012-02-03 00:25:57

+0

沒有想到這個......這可能是最好的答案! – Nick 2012-02-03 18:29:12

回答

1

嵌套的選擇是遠遠超過加入更好,所以只是前兩個查詢合併爲一個:

SELECT * FROM names WHERE account_id IN (
SELECT account_id FROM accounts WHERE enabled=1); 
+3

我找不到有關SQLite在子查詢中比聯接好得多的東西。你有什麼消息嗎? – 2012-02-02 23:34:44

+0

不,我沒有任何信息,只有SQLite的經驗(並且差異越大,您擁有的聯接就越多)。 – user1096188 2012-02-02 23:38:43

0

考慮到查詢非常簡單,SQL引擎在第一種情況下所做的大量工作就是將數據格式化/傳遞給您的程序,以便立即將其發回並必須再次解析它,第二個版本應該是相當多的效率(和保存程序的一些工作太)

0

SELECT * FROM names WHERE EXISTS (SELECT 1 FROM accounts WHERE account_id = names.account_id AND enabled=1);