我在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
答案 0 :(得分:0)
此声明:
select * from users where username = 'johndoe'
可以肯定地运行username
列,但不存在一个索引会更快。
您创建的索引:
CREATE INDEX usersindex on users (username, address, date_signup)
不是username
的索引,而是所有3列username, address, date_signup
的索引。
当然,我不知道这是否是您的意图。
如果运行包含SELECT
或WHERE
子句的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,它也使用索引。)