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,
    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_944_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;

关于performance - sqlite即使索引也很难查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57610961/

相关文章:

csv - 如何输出带有引号的 SQLite 列

python - django 中用户表的外键

android - 在 Android 中更新预填充的数据库

python - Tkinter Canvas 更新速度在程序过程中降低

java - 在具有许多 if 语句的 for 循环中使用 continue 时是否会提高性能?

javascript - 我如何优化此 CSS3/许多图像以提高性能?

java - 无法使用给定的查询删除数据

sqlite - EF Core 中每隔一个数据行都有一个空关系

java - 垃圾回收会改变Java中的对象地址吗?

javascript - CSS 变换。如果我以像素为单位定义大小和位置,性能会提高吗?