Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database SQLite3读写速度对于>;28克_Database_Sqlite - Fatal编程技术网

Database SQLite3读写速度对于>;28克

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,

当表大小变大时,SQL读写性能非常慢

下面是表模式

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