为了一个研究项目,我创建了一个存储新闻文章的sqlite数据库。目前该数据库有272GB大,存储在一个2TB的云卷上。我的云计算机器有32个核心和128GB的内存,并连接到这个卷。
我正在运行以下查询。 【替换代码0 其中我用一个年份和大约6个来源来替换'{}'。
运行这个查询需要大约1小时,结果是数据库产生了大约45万行(总行数为9000万)。在做这个过程中,CPU的使用率几乎为0%。
该表是这样创建的。 【替换代码1 并且我分别对来源和年份进行了索引。
查询的解释是。 【替换代码2
我在数据库存放的目录下进行了一次ioping测试,得到了。
--- . (ext4 /dev/vdb) ioping statistics ---
99 requests completed in 31.1 ms, 396 KiB read, 3.18 k iops, 12.4 MiB/s
generated 100 requests in 1.65 min, 400 KiB, 1 iops, 4.04 KiB/s
min/avg/max/mdev = 157.4 us / 314.5 us / 477.6 us / 76.8 us
和下面的fio测试fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=fiotest --filename=testfio --bs=4k --iodepth=64 --size=8G --readwrite=randrw --rwmixread=75
给出了这个结果。
read: IOPS=10.8k, BW=42.3MiB/s (44.4MB/s)
write: IOPS=3619, BW=14.1MiB/s (14.8MB/s)
我还尝试了诸如``PRAGMA synchronous=OFF``和不同的日志,如内存和WAL。
我有点不明白为什么数据库这么慢,我应该怎么做才能提高速度。是我在设置中犯了一个愚蠢的错误,还是基础设施不完善?我是否应该切换到数据仓库解决方案,如亚马逊的Rdshift?
PS: 我通过pythons sqlite3库连接到数据库,并使用以下代码
def select_articles_by_year_and_sources(self, year, sources=None):
cur = self.conn.cursor()
rows = cur.execute(select_articles_by_year_and_sources_query.format(year, sources))
return iter(ResultIterator(rows))
conn = db.NewsDb(path_db) # connect to database
articles = list(conn.select_articles_by_year_and_sources(year, sources))
conn.close()