Performance 即使使用索引,sqlite查询速度也非常慢

Performance 即使使用索引,sqlite查询速度也非常慢,performance,sqlite,Performance,Sqlite,我有一个非常简单的数据库,只有一个表: CREATE TABLE records ( id INTEGER PRIMARY KEY AUTOINCREMENT, symbol VARCHAR(20) NOT NULL, time_ts INTEGER NOT NULL, open_ts INTEGER NOT NULL, close_ts INTEGER NOT NULL, open_price REAL NOT NULL,

我有一个非常简单的数据库,只有一个表:

CREATE TABLE records ( 
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    symbol VARCHAR(20) NOT NULL, 

    time_ts INTEGER NOT NULL, 
    open_ts INTEGER NOT NULL, 
    close_ts INTEGER NOT NULL, 

    open_price REAL NOT NULL,
    high_price REAL NOT NULL,
    low_price REAL NOT NULL,
    close_price REAL NOT NULL,

    trades_count INTEGER NOT NULL,

    volume_amount REAL NOT NULL,
    quote_asset_volume REAL NOT NULL,
    taker_buy_base_asset_volume REAL NOT NULL,
    taker_buy_quote_asset_volume REAL NOT NULL)
和一个索引:

CREATE INDEX symbol_index ON records (symbol)
数据库的大小为
12.63GB

我正在运行此查询:

SELECT 
    symbol, 
    MAX(close_ts) max_close_ts, 
    MIN(close_ts) min_close_ts 
FROM records 
GROUP BY symbol
执行它大约需要一分钟

如您所见,索引是在
symbol
列上创建的。。然而,即使这样,查询速度也非常慢

即使是这样的查询:

select count(id) from records;
执行大约需要77秒。表中的总行数为
115\u 944\u 904

我预计未来这一记录将增加两倍。我能做些什么来加快查询的速度吗?即使主键和符号列上有索引,我的性能也相当差


我是否达到了任何类型的限制?

您可以创建覆盖索引以避免访问表:

CREATE INDEX symbol_index ON records (symbol,close_ts)

SELECT 
    symbol, 
    MAX(close_ts) max_close_ts, 
    MIN(close_ts) min_close_ts 
FROM records 
GROUP BY symbol;
如果您使用“解释查询计划”并查看扫描统计信息,它还将显示您创建的索引何时使用该索引。此外,还应创建覆盖索引“”,以获得更好的性能

例如: 解释查询计划
从记录中选择计数(id)

正如Lukasz Szozda所说

CREATE INDEX symbol_index ON records (symbol,close_ts)
应该使查询更快,因为每个组上有两条聚合语句

这样,DMB将跳过符号列中每个不同条目的所有中间行


您将利用的优势与符号成正比:您拥有的符号列条目越少,查询的速度就越快

为了将来参考,sqlite3命令行shell有一个功能,可以建议为给定查询添加索引:在添加索引后在表上运行也是一个好主意,在关闭数据库之前,如果需要,可以重新生成统计信息比显式列出列快。现在,使用组执行相同查询需要约11秒。有没有办法增加一个简单的查询
select count(id)from records性能?我发现很难相信记录的计数会这么慢。。