我有两个表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选择更快的?感谢
答案 0 :(得分:1)
您需要查看查询计划以查看实际发生的情况。以下是(知情的)推测。
当你有一组带有两组索引的内联接时,你基本上有两个可能的查询计划:
edict
表,并使用favourites
上的索引在favourite.word
中查找字词。favourite
表格并使用edicts
上的索引在edicts(word)
中查找字词。然后在匹配时在edit
中查找记录。(唯一的约束创建索引。)
所有这些都是相同的 - 也就是说,没有关于表格大小的信息 - 在这种情况下,首选方法是首选。为什么?因为没有额外的步骤来查找其他列。
当您使用in
表达查询时,我认为SQLite将始终使用第一种方法。在这种情况下,我猜测favourite
表比edict
表小得多,所以第二种方法实际上更好。当您将查询编写为join
时,会考虑两种可能性,并选择更好的可能性。