我在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?
答案 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._id
或translation.language
似乎未编入索引(可能两列都需要编制索引)。
使用CREATE INDEX ...
command为这两列添加索引可以加快查询速度。