SQLite数据库优化

标签 sql sqlite sql-optimization

我有包含三个表的 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 秒。

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

最佳答案

我认为除了使用 SQLite Full Text Search extension 之外,没有任何实用的方法可以让您的查询运行得更快.

FTS 允许使用快速版本的 MATCH 子句,而不是本质上较慢的 LIKE

不幸的是,iOS 上默认情况下未启用 FTS,但如果您构建自己的应用程序并且 include your own copy of SQLite with FTS enabled 显然您仍然可以这样做。 .

关于SQLite数据库优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14153757/

相关文章:

mysql - 更新替换 SQL 中的分号出现语法错误

sql - 我没有使用此查询获得不同的记录

mysql - 错误 - "Result consisted of more than one row",由于 GROUP BY

node.js - 我通过 Node js 将 sqlite3 查询结果作为 json 发送到浏览器

SQL 优化

php - 使用按钮从表中删除数据行

使用图像的 Android 室内地图根据目的地的输入生成从点 a 到 b 的不同路径(不使用室内导航技术)

java - 使用 Java 备份 SQLite

MySQL 不使用多列索引

mysql performance INSERT into table SELECT 报告