对于大型结果集,MySQLdb非常慢

时间:2011-05-13 15:42:59

标签: python mysql-python

我在phpMyAdmin和amp;中执行了以下查询。 MySQLdb(python)。

SELECT *, (SELECT CONCAT(`id`, '|', `name`, '|', `image_code`)
FROM `model_artist` WHERE `id` = `artist_id`) as artist_data, 
FIND_IN_SET("metallica", `searchable_words`) as find_0
FROM `model_song` HAVING find_0

phpMyAdmin表示查询耗时 2ms 。 我的python代码说使用MySQLdb,查询花了 848ms (甚至没有得到结果)。

python代码:

self.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ibeat")
self.cur = self.db.cursor()

millis = lambda: time.time() * 1000

start_time = millis()
self.cur.execute_cmd("""SELECT *, (SELECT CONCAT(`id`, '|', `name`, '|', `image_code`)
FROM `model_artist` WHERE `id` = `artist_id`) as artist_data, 
FIND_IN_SET("metallica", `searchable_words`) as find_0
FROM `model_song` HAVING find_0""")
print millis() - start_time

2 个答案:

答案 0 :(得分:15)

如果您希望SQL查询具有较大的结果集,然后您计划逐个记录迭代,那么您可能需要考虑使用MySQLdb SSCursor而不是默认光标。默认光标将结果集存储在客户端中,而SSCursor将结果集存储在服务器中。与默认光标不同,如果您需要做的只是逐个遍历记录,SSCursor将不会产生大的初始延迟。

您可以在how to use the SSCursor here上找到一些示例代码。

例如,尝试:

import MySQLdb.cursors

self.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ibeat",
                          cursorclass = MySQLdb.cursors.SSCursor)

(其余代码可以保持不变。)

答案 1 :(得分:4)

PHPMyAdmin对所有查询设置了限制,因此您不会在界面中返回大型结果集。因此,如果您的查询通常返回1,000,000行,并且PHPMyAdmin将其减少到1,000(或默认值为),那么当Python抓取甚至查询整个结果集时,您将不得不期望更长的处理时间。

尝试在Python中设置一个与PHPMyAdmin限制相匹配的限制来比较时间。