【发布时间】:2020-08-13 19:57:41
【问题描述】:
使用以下架构:
sqlite>
sqlite>
sqlite> .schema
CREATE TABLE movie (
id INTEGER PRIMARY KEY, title TEXT, year INTEGER, nth TEXT, for_video BOOLEAN
);
CREATE TABLE actor (
id INTEGER PRIMARY KEY, name TEXT, gender TEXT
);
CREATE TABLE role (
movie_id INTEGER, actor_id INTEGER, name TEXT
);
CREATE TABLE sqlite_stat1(tbl,idx,stat);
sqlite>
在两个表上运行JOIN,如下所示:
sqlite> select * from movie JOIN role ON (movie.id = role.movie_id) WHERE movie.title='Batman' LIMIT 1;
"id" "title" "year" "nth" "for_video" "movie_id" "actor_id" "name"
"47844" "Batman" "1989" "" "0" "47844" "84264" "Napier Hood"
sqlite>
为了性能,我添加了以下索引:
sqlite> create index id1 on role(movie_id);
sqlite>
sqlite>
sqlite> create index id2 on movie(title);
sqlite>
sqlite>
然后查询计划说:
案例一
sqlite> EXPLAIN QUERY PLAN select * from movie JOIN role ON (movie.id = role.movie_id) WHERE movie.title='Batman' LIMIT 1;
"selectid" "order" "from" "detail"
"0" "0" "0" "SEARCH TABLE movie USING INDEX id2 (title=?)"
"0" "1" "1" "SEARCH TABLE role USING INDEX id1 (movie_id=?)"
案例 2
sqlite> EXPLAIN QUERY PLAN select movie.title, role.name from movie JOIN role ON (movie.id = role.movie_id)
...> WHERE role.name = 'King Arthur' LIMIT 2;
"selectid" "order" "from" "detail"
"0" "0" "0" "SCAN TABLE movie USING COVERING INDEX id2"
"0" "1" "1" "SEARCH TABLE role USING INDEX id1 (movie_id=?)"
sqlite>
sqlite>
对于给定的两种情况:
-
DB引擎如何决定,它需要先搜索
movie表,然后搜索role表? -
为什么 DB engine
SCANningmovietable 在第二种情况下?而不是SEARCH
【问题讨论】:
-
你使用的是 MySQL 还是 SQLite?
-
@jarlh 正在使用 sqlite
标签: sql sqlite indexing query-optimization