【问题标题】:Why one sqlite query is so much slower even though they are very similar?为什么一个 sqlite 查询即使它们非常相似也慢得多?
【发布时间】:2014-04-11 05:09:52
【问题描述】:

>

sqlite> .timer 开启

查询 1

sqlite> select count(*) from alpha where Name = 'SHOUT' and Date between 20130101 and 20140101;

3783443

CPU 时间:用户 42.067187 sys 2.098010

查询 2

sqlite> select count(*) from alpha where Date 介于 20130101 和 20140101 之间;

3783443

CPU 时间:用户 0.450523 sys 0.054451

架构:

sqlite> .schema 创建表 alpha ( 日期日期, 名称 VARCHAR(50), 符号 VARCHAR(10), 价值浮动, ChangeDate DATETIME DEFAULT CURRENT_TIMESTAMP, 主键(日期,名称,符号)); 创建表 cusip ( 符号 VARCHAR(10), Cusip VARCHAR(9), 主键(符号));

在 alpha(日期)上创建索引 idx_alpha_Date;

在 alpha(符号)上创建索引 idx_alpha_Symbol;

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

在 alpha(名称)上创建索引 idx_alpha_name;

【问题讨论】:

    标签: sqlite indexing


    【解决方案1】:

    使用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 应用于该中间结果集中的所有结果,可能需要很长时间。在后一种情况下,可以仅从索引中获取结果,而无需扫描中间结果集。

    【讨论】:

    • 我在查询中使用的两个字段都有索引。为什么它不使用索引来优化查询的两个部分?也许更重要的是,我怎样才能让较慢的查询运行得与较快的查询差不多?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2011-10-19
    相关资源
    最近更新 更多