Mos*_*vah 7 python mysql-python
我在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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 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)
Run Code Online (Sandbox Code Playgroud)
(其余代码可以保持不变.)
PHPMyAdmin 对所有查询设置了限制,因此您不会在界面中返回大型结果集。因此,如果您的查询通常返回 1,000,000 行,而 PHPMyAdmin 将其减少到 1,000(或任何默认值),那么当 Python 抓取甚至查询整个结果集时,您将不得不期望更长的处理时间。
尝试在 Python 中设置一个与 PHPMyAdmin 上的限制相匹配的限制来比较时间。
| 归档时间: |
|
| 查看次数: |
5248 次 |
| 最近记录: |