我有包含三个表的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条记录、document ~= 1000条记录和document_index ~= 500,000条记录时,查询在我的iPad 2上执行了大约30秒。
如何优化查询或改变数据库结构(例如添加索引)来减少查询时间?
发布于 2013-01-07 03:01:26
我找到了解决方案。此解决方案将查询执行速度提高了60倍!时间。我找到了here和更详细的- here。这很简单,我替换了LIKE表达式来比较>=和<:
旧的:
dictionary.word LIKE 'prezident%'新的:
dictionary.word >= 'prezident' AND dictionary.word < 'prezidentz' /* Added z to the second string*/ 这个解决方案有一个限制,我可以通过字符串的一部分来查找,但在字符串的末尾,即'expr%‘。
感谢大家的帮助!
发布于 2013-01-04 17:02:52
除了使用SQLite Full Text Search extension之外,我不认为有任何实用的方法可以让您的查询更快地工作。
FTS允许使用快速版本的MATCH子句,而不是固有的慢LIKE。
不幸的是,在iOS上没有默认启用FTS,但显然如果你构建自己的应用程序和include your own copy of SQLite with FTS enabled,你仍然可以这样做。
发布于 2013-01-04 17:08:13
瓶颈很可能是部分WHERE dictionary.word LIKE @pQuery。
你的用例真的有必要使用LIKE查询,而不仅仅是检查字符串是否相等吗?
https://stackoverflow.com/questions/14153757
复制相似问题