SQLite不喜欢内连接?

时间:2014-04-20 13:22:05

标签: sql sqlite

我在sqlite申请中遇到android时遇到问题。 似乎任何JOIN OPERATION完全杀死了我的表现

一个表是一个fts3表,因为我的应用程序是一个字典,我读了fts3好处字典就像查找。 这些是我要加入的2个表(主要是用不同的语言得到单词(okurigana)的含义:

CREATE VIRTUAL TABLE tango USING fts3 (okurigana, kana, pos, pos_detail);
CREATE TABLE translation (_id int(7), language VARCHAR(10), meaning VARCHAR(100), FOREIGN KEY (_id) REFERENCES tango(rowid));
CREATE INDEX lang_match ON translation (language);

我使用以下命令查询这些表:

Select a.rowid, a.okurigana, a.kana, b.meaning 
from tango a inner join translation b 
   ON a.rowid=b._id AND b.language='eng' 
WHERE a.okurigana MATCH 'A*'" 

查询需要几秒钟才能完成。我不明白为什么。如果我使用此查询(删除内部联接),查询速度非常快。

Select a.rowid, a.okurigana, a.kana  
from tango a 
WHERE a.okurigana MATCH 'A*';

为什么联接会杀死性能o.0?

2 个答案:

答案 0 :(得分:2)

您可以使用索引加快查询速度。这是您的查询:

Select a.rowid, a.okurigana, a.kana, b.meaning
from tango a inner join
     translation b
     ON a.rowid = b._id AND b.language = 'eng'
WHERE a.okurigana MATCH 'A*'" ;

引擎基本上有两种处理此查询的方法。一种方法是使用tango子句对where进行过滤,然后在translation中查找值。为此,一个有用的索引是:

create index translation_id_language_meaning on translation(_id, language, meaning)

另一种方法是扫描translation,然后在探戈上进行查找。为此,一个有用的索引是:

create index translation_language_id_meaning on translation(language, _id, meaning) 

第一个可能最适合您的查询,但更好的解决方案取决于表统计信息和值的分布。

答案 1 :(得分:1)

如果添加内部联接会减慢查询速度而不会显着增加您返回的行数,通常是因为您的架构缺少索引。

在您的情况下,您的translation._idtranslation.language似乎未编入索引(可能两列都需要编制索引)。

使用CREATE INDEX ... command为这两列添加索引可以加快查询速度。