为什么这个子查询比内连接快10倍

时间:2014-11-30 12:57:03

标签: sql sqlite

我有两个表ecdict和收藏夹,一个视图只是内连接两个表。

CREATE TABLE ecdict('_id' INTEGER PRIMARY KEY, 'word' VARCHAR NOT NULL UNIQUE, 'meaning' VARCHAR, 'phonetic_string' VARCHAR, 'example' VARCHAR);
CREATE TABLE favourite('_id' INTEGER PRIMARY KEY, 'word' VARCHAR NOT NULL UNIQUE);

CREATE VIEW favourite_word as select ecdict.* from ecdict INNER JOIN favourite ON ecdict.word = favourite.word;

以下是结果的执行时间:
时间:0.010

select ecdict.* from ecdict where word in (select word from favourite);

时间:0.226

select * from favourite_word;

为什么他们差异如此之大?如果与查询计划有关,为什么sqlite选择较慢的?如何指导sqlite选择更快的?感谢

1 个答案:

答案 0 :(得分:1)

您需要查看查询计划以查看实际发生的情况。以下是(知情的)推测。

当你有一组带有两组索引的内联接时,你基本上有两个可能的查询计划:

  1. 扫描edict表,并使用favourites上的索引在favourite.word中查找字词。
  2. 扫描favourite表格并使用edicts上的索引在edicts(word)中查找字词。然后在匹配时在edit中查找记录。
  3. (唯一的约束创建索引。)

    所有这些都是相同的 - 也就是说,没有关于表格大小的信息 - 在这种情况下,首选方法是首选。为什么?因为没有额外的步骤来查找其他列。

    当您使用in表达查询时,我认为SQLite将始终使用第一种方法。在这种情况下,我猜测favourite表比edict表小得多,所以第二种方法实际上更好。当您将查询编写为join时,会考虑两种可能性,并选择更好的可能性。