2012-02-02 81 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);