SQLite数据库不使用现有索引

时间:2018-11-11 17:20:52

标签: database indexing sqlite

我在3列上创建了索引,但是搜索仍然非常缓慢。似乎根本没有使用索引。

sqlite> .schema
CREATE TABLE users(username, address, date_signup);
CREATE INDEX usersindex on users (username, address, date_signup);
sqlite> explain query plan select * from users where username = 'johndoe';
0|0|0|SCAN TABLE users
sqlite> 

我该如何解决?

编辑:我正在使用的sqlite版本为SQLite version 3.11.0 2016-02-15 17:29:24

2 个答案:

答案 0 :(得分:0)

此声明:

select * from users where username = 'johndoe'

可以肯定地运行username列,但不存在一个索引会更快。

您创建的索引:

CREATE INDEX usersindex on users (username, address, date_signup) 

不是username的索引,而是所有3列username, address, date_signup的索引。
当然,我不知道这是否是您的意图。
如果运行包含SELECTWHERE子句的JOIN语句一起引用这3列,则应该会看到一个改进。

答案 1 :(得分:0)

我无法复制。

$ sqlite3
SQLite version 3.25.3 2018-11-05 20:37:38
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> CREATE TABLE users(username, address, date_signup);
sqlite> CREATE INDEX usersindex on users (username, address, date_signup);
sqlite> explain query plan select * from users where username = 'johndoe';
QUERY PLAN
`--SEARCH TABLE users USING COVERING INDEX usersindex (username=?)
sqlite> 

如您所见,它正在按预期使用索引。从EXPLAIN QUERY PLAN格式开始,您使用的是旧版本...几岁了?由于可能会影响结果,因此可能对查询计划程序进行了更改和修复。您可以浏览change log来查看。

(我安装的sqlite3 shell的最旧版本是3.22,它也使用索引。)