7

我在 phpMyAdmin 和 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 查询花费了848 毫秒(甚至没有获取结果)。

蟒蛇代码:

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
4

2 回答 2

15

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

您可以在此处找到一些关于如何使用 SSCursor的示例代码。

例如,尝试:

import MySQLdb.cursors

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

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

于 2011-05-13T15:56:08.577 回答
5

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

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

于 2011-05-13T15:49:27.597 回答