我可以加快查询>600Mio行的SQLite数据库吗?

问题描述 投票:0回答:1

我创建了一个本地数据库,其中包含大约 600Mio 条目,我想高效地查询这些条目(我第一次尝试使用 pandas,但这太慢了)。这是一个本地 dbSNP,仅包含感兴趣的人的 rsID 和基因组位置。为此,我使用了这段代码:

import sqlite3
import gzip
import csv

rsid_db = sqlite3.connect('rsid.db')

rsid_cursor = rsid_db.cursor()

rsid_cursor.execute(
"""
CREATE TABLE rsids (
rsid TEXT,
chrom TEXT,
pos INTEGER,
ref TEXT,
alt TEXT
)
"""
)

with gzip.open('00-All.vcf.gz', 'rt') as vcf: # from https://ftp.ncbi.nih.gov/snp/organisms/human_9606/VCF/00-All.vcf.gz
    reader = csv.reader(vcf, delimiter="\t")
    i = 0
    for row in reader:
        if not ''.join(row).startswith('#'):
            rsid_cursor.execute(
            f"""
            INSERT INTO rsids (rsid, chrom, pos, ref, alt)
            VALUES ('{row[2]}', '{row[0]}', '{row[1]}', '{row[3]}', '{row[4]}');
            """
            )
            i += 1
            if i % 1000000 == 0:
                print(f'{i} entries written')
                rsid_db.commit()

rsid_db.commit()

rsid_db.close()

我想用这个数据库做的就是查询多个 rsID 并获取它们的基因组位置和改变。一个条目看起来像这样:

   rsid     chrom   pos   ref  alt
rs537152180   1   4002401  G   A,C

我目前使用这个函数查询它:

import sqlite3
import pandas as pd


def query_rsid(rsid_list,
               rsid_db_path='rsid.db'):

    with sqlite3.connect(rsid_db_path) as rsid_db:

        rsid_cursor = rsid_db.cursor()
        rsid_cursor.execute(
        f"""
        SELECT * FROM rsids
        WHERE rsid IN ('{"', '".join(rsid_list)}');
        """
        )

        query = rsid_cursor.fetchall()

    return query

无论查询多少条,大约需要1.5分钟。有没有办法使用 SQLite 来加快速度,或者这只是受我的机器限制?

python sqlite
1个回答
0
投票

按照评论中的建议,您可以使用以下方法在 rsid 列上创建索引:

CREATE UNIQUE INDEX idx_rsid 
ON rsids(rsid);
© www.soinside.com 2019 - 2024. All rights reserved.