首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sqlite数据库优化

Sqlite数据库优化
EN

Stack Overflow用户
提问于 2013-01-04 16:40:47
回答 4查看 2.3K关注 0票数 2

我有包含三个表的sqlite3数据库:

代码语言:javascript
复制
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脚本从字典中选择包含单词的所有文档:

代码语言:javascript
复制
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秒。

如何优化查询或改变数据库结构(例如添加索引)来减少查询时间?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-07 03:01:26

我找到了解决方案。此解决方案将查询执行速度提高了60倍!时间。我找到了here和更详细的- here。这很简单,我替换了LIKE表达式来比较>=和<:

旧的:

代码语言:javascript
复制
dictionary.word LIKE 'prezident%'

新的:

代码语言:javascript
复制
dictionary.word >= 'prezident' AND dictionary.word < 'prezidentz' /* Added z to the second string*/ 

这个解决方案有一个限制,我可以通过字符串的一部分来查找,但在字符串的末尾,即'expr%‘。

感谢大家的帮助!

票数 0
EN

Stack Overflow用户

发布于 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,你仍然可以这样做。

票数 2
EN

Stack Overflow用户

发布于 2013-01-04 17:08:13

瓶颈很可能是部分WHERE dictionary.word LIKE @pQuery

  1. 您在dictionary.word上没有索引,因此SQLite需要扫描正在使用LIKE运算符的完整表
  2. ,这在大多数情况下不能使用索引。

你的用例真的有必要使用LIKE查询,而不仅仅是检查字符串是否相等吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14153757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档