gpt4 book ai didi

sql - sqlite`order by`和`where`子句可以一起使用Index吗

转载 作者:行者123 更新时间:2023-12-03 18:34:14 25 4
gpt4 key购买 nike

建立表格

CREATE TABLE Shares(
shareId TEXT PRIMARY KEY NOT NULL,
fromId INTEGER NOT NULL,
toId INTEGER NOT NULL,
time INTEGER NOT NULL);


并创建索引

CREATE INDEX Shares_time_toId_fromId ON Shares(time, toId, fromId);


然后插入一些行

insert into Shares(shareId, fromId, toId, time) values(1,1,1,1);
insert into Shares(shareId, fromId, toId, time) values(2,2,2,2);
insert into Shares(shareId, fromId, toId, time) values(3,3,3,3);
insert into Shares(shareId, fromId, toId, time) values(4,3,3,4);
insert into Shares(shareId, fromId, toId, time) values(5,3,3,5);


使用说明来显示

explain select * from Shares where toId=3 and fromId=3 order by time desc;


结果是

0|Init|0|20|0||00|
1|Noop|0|0|0||00|
2|OpenRead|0|2|0|4|00|
3|OpenRead|2|4|0|k(4,nil,nil,nil,nil)|00|
4|Last|2|17|1|0|00|
5|IdxRowid|2|1|0||00|
6|Seek|0|1|0||00|
7|Column|2|1|2||00|
8|Ne|3|16|2|(BINARY)|54|
9|Column|2|2|4||00|
10|Ne|3|16|4|(BINARY)|54|
11|Column|0|0|5||00|
12|Copy|4|6|0||00|
13|Copy|2|7|0||00|
14|Column|2|0|8||00|
15|ResultRow|5|4|0||00|
16|Prev|2|5|0||01|
17|Close|0|0|0||00|
18|Close|2|0|0||00|
19|Halt|0|0|0||00|
20|Transaction|0|0|2|0|01|
21|TableLock|0|2|0|Shares|00|
22|Integer|3|3|0||00|
23|Goto|0|1|0||00|


看来查询使用索引来完成工作。但是我不知道它是使用全部三个索引还是仅使用时间来进行索引。
我希望所有索引都可以用来提高性能。

最佳答案

要了解查询的执行方式,请不要使用EXPLAIN,而要使用EXPLAIN QUERY PLAN

explain query plan select * from Shares where toId=3 and fromId=3 order by time desc;
0|0|0|SCAN TABLE Shares USING INDEX Shares_time_toId_fromId


在此查询中,从索引中读取 toIdfromId值,但这无关紧要,因为无论如何都必须读取实际表以获取 shareId值。

如果查询未尝试读取 shareId列,或者 shareId列的类型为 INTEGER,因此它将成为 rowid的别名,并因此成为索引的一部分,则将进行单独的表查找不需要步骤。

(注意: sqlite3工具的 latest版本可以更好地格式化EXPLAIN输出。)

关于sql - sqlite`order by`和`where`子句可以一起使用Index吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38653204/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com