SQLite:即使有索引,大型数据库中的查询也非常慢

Posted

技术标签:

【中文标题】SQLite:即使有索引,大型数据库中的查询也非常慢【英文标题】:SQLite: Very slow queries in a large database even with indexes 【发布时间】:2021-05-11 11:15:10 【问题描述】:

我有一个大型数据库。 该数据库具有loginlevel 列。 在我为这些列创建索引之前,所有查询都非常慢。 我使用这些命令来创建索引:

CREATE INDEX users_login_index on users(login);
CREATE INDEX users_level_index on users(level);

现在我可以通过login(它是唯一的)快速找到一个用户,或者通过level 快速找到许多用户。 例如,这个查询很快(立即生效):

SELECT * FROM users WHERE login='somelogin123';

但是这个查询很慢:

SELECT * FROM users WHERE login='somelogin123' AND level=1;

在同一个数据库中。我不明白为什么在添加一个比较也被索引的列的附加条件之后查询变得很慢。 请向我解释这是如何工作的,或者我做错了什么以及如何解决我的问题。 希望得到您的帮助!

【问题讨论】:

【参考方案1】:

SQLite 可能选择了错误的索引。我怀疑level 只有少数值。对于索引而言,这通常不是一个好主意。尝试将其设为复合索引:

CREATE INDEX users_level_index_login on users(level, login);

【讨论】:

以上是关于SQLite:即使有索引,大型数据库中的查询也非常慢的主要内容,如果未能解决你的问题,请参考以下文章

非常慢的 MySQL COUNT DISTINCT 查询,即使有索引——如何优化?

MySQL 索引未在大型数据库中使用

规约先行-(十五)索引规约

MySQL开发索引创建规范

sqlite的缺点和限制

5.2 MySql数据库_索引规约