我有三个表的sqlite3数据库:
CREATE TABLE document (
id Int PRIMARY KEY NOT NULL,
root_id Int,
name Varchar(100),
active Tinyint
);
CREATE INDEX IDX_documentId ON document (id);
CREATE INDEX IDX_documentName ON document (name);
CREATE TABLE dictionary (
id Int PRIMARY KEY NOT NULL,
word Varchar(100) NOT NULL
);
CREATE INDEX IDX_dictionaryId ON dictionary (id);
CREATE UNIQUE INDEX IDX_dictionaryWord ON dictionary (word ASC);
CREATE TABLE document_index (
id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
document_id Int NOT NULL,
word_id Int NOT NULL,
FOREIGN KEY(document_id) REFERENCES document(id),
FOREIGN KEY(word_id) REFERENCES dictionary(id)
);
CREATE INDEX IDX_documentIndexId ON document_index (id);
CREATE INDEX IDX_documentIndexDocId ON document_index (document_id);
CREATE INDEX IDX_documentIndexWordId ON document_index (word_id);
我有sql脚本来选择包含字典中单词的所有文档:
SELECT document.id, document.name
FROM document
INNER JOIN document_index on document_index.document_id=document.id
INNER JOIN dictionary on dictionary.id=document_index.word_id
WHERE dictionary.word LIKE @pQuery
AND document.active = 1
AND document.root_id in (@pRoot1, @pRoot2, @pRoot3, @pRoot4, @pRoot5, @pRoot6, @pRoot7)
当字典包含〜= 400,000条记录,文档〜= 1000条记录和document_index~ = 500,000条记录时,查询在我的iPad 2上执行约30秒。
如何优化查询或更改数据库结构(例如添加索引)以减少查询时间?
答案 0 :(得分:2)
除了使用SQLite Full Text Search extension之外,我认为除了使用include your own copy of SQLite with FTS enabled之外,还有任何实用的方法可以让您的查询更快。
FTS允许使用MATCH
子句的快速版本,而不是本身慢LIKE
。
不幸的是,默认情况下,iOS上没有启用FTS,但显然,如果您构建自己的应用程序{{3}},仍然可以执行此操作。
答案 1 :(得分:2)
瓶颈很可能是WHERE dictionary.word LIKE @pQuery
部分。
您的用例是否真的需要使用LIKE查询而不仅仅是检查字符串是否相等?
答案 2 :(得分:0)
尝试使用dictionary.word = @pQuery
代替dictionary.word LIKE @pQuery
运行“分析”
答案 3 :(得分:0)