我有一个160GB的SQLite数据库。表hwmp
的id
列和stage
列上有一个索引。
CREATE INDEX idx_hwmp_id ON hwmp (id, stage);
当我进行行计数时,查询将在0.09秒内返回。
sqlite> select count (*) from hwmp where id = 2000 and stage = 4;
59397
Run Time: real 0.091 user 0.000074 sys 0.080494
然而,对于选择,所有的实时时间都是85秒。用户和系统的时间加起来只有2.5秒。为什么实际时间会这么高?
select * from hwmp where id = 2000 and stage = 4;
Run Time: real 85.420 user 0.801639 sys 1.754250
如何修复?对sqlite3数据库(300MB(的另一个查询过去在20ms内返回。今天花了652毫秒。
Run Time: real 0.652 user 0.018766 sys 0.010595
今天的Linux环境出现了问题。我把同样的SQLite下载到我的Mac上,它运行得很快。
Run Time: real 0.028 user 0.005990 sys 0.010420
它正在使用索引:
sqlite> explain query plan select * from hwmp where id = 78 and stage = 4;
QUERY PLAN
`--SEARCH hwmp USING INDEX idx_hwmp_id (id=? AND stage=?)
Run Time: real 0.005 user 0.000857 sys 0.000451
相关设置为pragma cache_size = 200000;
200000页4096字节。设置后,第一次查询大约需要3s,第二次查询需要0.28s。
缓存设置在一段时间内提高了性能。我们正在使用一个连接了EBS SSD的AWS linux虚拟机。环境似乎也有问题。我的Mac中的查询时间比AWS linux/EBS环境快6.3倍。