使用Pythons sqlite模块进行连接比手动执行要慢

2024-10-01 11:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用pythons内置的sqlite3模块访问数据库。我的查询在一个包含150000个条目的表和一个包含40000个条目的表之间执行一个联接,结果再次包含大约150000个条目。如果我在SQLite Manager中执行查询,则需要几秒钟的时间,但如果我从python执行相同的查询,则一分钟后它还没有完成。下面是我使用的代码:

cursor = self._connection.cursor()
annotationList = cursor.execute("SELECT PrimaryId, GOId " + 
                                "FROM Proteins, Annotations " +
                                "WHERE Proteins.Id = Annotations.ProteinId")
annotations = defaultdict(list)
for protein, goterm in annotationList:
    annotations[protein].append(goterm)

我做fetchall只是为了测量执行时间。有人能解释这种巨大的性能差异吗?我在macosx10.6.4上使用python2.6.1。在

编辑

我手动实现了连接,这工作得更快。代码如下:

^{pr2}$

因此,当我自己获取表,然后用python进行连接时,大约需要2秒钟。上面的代码要花很长时间。我是不是少了点什么?在

第二次编辑 我现在用apsw做了同样的尝试,效果很好(代码根本不需要更改),性能非常好。我仍然在想,为什么使用sqlite3-模块的速度这么慢。在


Tags: 模块代码目的编辑时间性能sqlite3cursor
2条回答

这里有一个关于它的讨论:http://www.mail-archive.com/python-list@python.org/msg253067.html

看来sqlite3模块中存在性能瓶颈。有一个advice如何使查询更快:

  • 确保在连接列上有索引
  • 使用pysqlite

您还没有发布相关表的模式,但是我认为索引可能有问题,特别是没有索引蛋白质。Id或者注释.ProteinId(或两者兼而有之)。在

创建如下SQLite索引

CREATE INDEX IF NOT EXISTS index_Proteins_Id ON Proteins (Id)
CREATE INDEX IF NOT EXISTS index_Annotations_ProteinId ON Annotations (ProteinId)

相关问题 更多 >