Database SQLite3读写速度对于>;28克
当表大小变大时,SQL读写性能非常慢 下面是表模式Database SQLite3读写速度对于>;28克,database,sqlite,Database,Sqlite,当表大小变大时,SQL读写性能非常慢 下面是表模式 CREATE TABLE stock_price_minute_data ( "ticker" TEXT NOT NULL, "timestamp" TIMESTAMP NOT NULL, "open" FLOAT NOT NULL,
CREATE TABLE stock_price_minute_data (
"ticker" TEXT NOT NULL,
"timestamp" TIMESTAMP NOT NULL,
"open" FLOAT NOT NULL,
"high" FLOAT,
"low" FLOAT,
"close" FLOAT,
"volume" FLOAT,
"vwap" FLOAT,
PRIMARY KEY ("timestamp" , "ticker")
);
我有约2.8亿条记录(表大小为28G)
下面这样的问题花了我5分钟多的时间才得到答案
select count(*) from stock_price_minute_data where ticker = 'SNPS';
如果我创建每个ticker表,则每个表都<100 MB,并且有~500K条记录。在这种情况下,性能良好(亚秒)
输出
QUERY PLAN
`--SCAN TABLE stock_price_minute_data USING COVERING INDEX sqlite_autoindex_stock_price_minute_data_1
这是因为随着表大小的增加,索引也会增加,并且不适合内存吗?如何调试确切原因?看起来问题是在复合主键的情况下(就像我上面的例子一样),SQLite将创建一个索引,但查询应该将时间戳作为query子句中的第一个变量。在我的情况下,我有股票代码,所以它是诉诸于一个完整的表扫描
sqlite> EXPLAIN QUERY PLAN select count(*) from stock_price_minute_data where ticker = 'SNPS';
QUERY PLAN
`--SCAN TABLE stock_price_minute_data USING COVERING INDEX sqlite_autoindex_stock_price_minute_data_1
ticker
上的索引可能…主键不是自动索引的吗?ticker已经是主键的一部分ticker
不是主键。它是主键的一部分,但它是主键中定义的第二列。通常情况下,复合索引定义中的第1列会在您发布的查询中受益于该索引。@forpas谢谢,我已经发布了答案。谢谢你的帮助。
QUERY PLAN
`--SCAN TABLE stock_price_minute_data USING COVERING INDEX sqlite_autoindex_stock_price_minute_data_1
sqlite> EXPLAIN QUERY PLAN select count(*) from stock_price_minute_data where ticker = 'SNPS';
QUERY PLAN
`--SCAN TABLE stock_price_minute_data USING COVERING INDEX sqlite_autoindex_stock_price_minute_data_1
sqlite> PRAGMA index_info('sqlite_autoindex_stock_price_minute_data_1');
seqno|cid|name
0|1|timestamp
1|0|ticker
sqlite> PRAGMA index_list('stock_price_minute_data');
seq|name|unique|origin|partial
0|sqlite_autoindex_stock_price_minute_data_1|1|pk|0