为什么一个sqlite查询是如此慢,即使它们非常相似?

时间:2014-04-11 05:09:53

标签: sqlite indexing

>

  

源码> .timer

     

查询1

     

源码>从alpha中选择count(*),其中Name ='SHOUT',日期在20130101和20140101之间;

     

3783443

     

CPU时间:用户42.067187 sys 2.098010

     

查询2

     

源码>从alpha中选择count(*),其中20130101和20140101之间的日期;

     

3783443

     

CPU时间:用户0.450523 sys 0.054451

     

架构:

     

源码> .schema   CREATE TABLE alpha(     日期日期,     名称VARCHAR(50),     符号VARCHAR(10),     价值FLOAT,     ChangeDate DATETIME DEFAULT CURRENT_TIMESTAMP,     主要密钥(日期,名称,符号));   CREATE TABLE cusip(     符号VARCHAR(10),     Cusip VARCHAR(9),     PRIMARY KEY(符号));

     

在alpha(Date)上创建INDEX idx_alpha_Date;

     

在alpha(符号)上创建INDEX idx_alpha_Symbol;

     

在alpha(日期,名称)上创建INDEX idx_alpha_date_name;

     

在alpha(Name)上创建INDEX idx_alpha_name;

1 个答案:

答案 0 :(得分:0)

使用explain query plan查看索引的使用方式,并了解更多详细信息explain,了解它如何转换为sqlite虚拟机代码。

sqlite> explain query plan select count(*) from alpha where Name = 'SHOUT' and Date between 20130101 and 20140101;
0|0|0|SEARCH TABLE alpha USING INDEX idx_alpha_name (Name=?) (~5 rows)
sqlite> explain query plan select count(*) from alpha where Date between 20130101 and 20140101;
0|0|0|SEARCH TABLE alpha USING COVERING INDEX idx_alpha_date_name (Date>? AND Date<?) (~31250 rows)

在第一种情况下,索引仅用于Name = 'SHOUT'部分,Date between 20130101 and 20140101应用于该中间结果集中的所有结果,可能需要很长时间。在后一种情况下,结果可以仅从索引获得,而无需扫描中间结果集。