在 MySQL 工作台正常工作的地方,Python MySQL 查询超时
Posted
技术标签:
【中文标题】在 MySQL 工作台正常工作的地方,Python MySQL 查询超时【英文标题】:Python MySQL queries time out where MySQL workbench works fine 【发布时间】:2016-12-21 05:59:02 【问题描述】:我最近将我的网站移到了新服务器上。我有一些基本的 python 脚本可以访问 mysql 数据库中的数据。在旧服务器上,我们没有问题。在新服务器上:
MySQLWorkbench 可以毫无问题地连接并执行所有查询 使用 python 的相同 (SELECT) 查询在 5% 的时间内工作,另外 95% 的时间在查询期间超时或连接丢失 例如该表有 100000 行,在 MySQLWorkbench 中选择整个事物可以正常工作。 3秒后返回。 在 python 中,相同的查询永远不会工作,当 LIMIT 2999 查询工作但只有 LIMIT 3010 会导致它超时。 在本地或远程运行脚本时观察到相同的效果现在已经研究了几天,以确定数据库、数据库服务器、服务器本身是否存在阻止 python(但不是 MySQLWorkbench)正常工作的设置。
查询和代码以防万一:
query = "SELECT * FROM wordpress.table;"
conn = MySQLConnection(**mysqlconfig)
cursor = conn.cursor()
cursor.execute(query)
rows = cursor.fetchall()
我没有关于服务器的详细信息,但它有足够的能力让 MySQLWorkbench 正常工作,只是 python 似乎无法正常工作
**** 编辑 ****
要查看此问题是否是由于查询返回的数据过多而导致 python 无法处理,我想到了使用 OFFSET 和 LIMIT 来循环遍历更大的查询,每个查询有 10 行。
total_rows = 100000
interval = 10
data = []
for n in range(0, total_rows / interval):
q = "SELECT * FROM wordpress.table LIMIT %s OFFSET %s" % (interval, n * interval)
cursor.execute(q)
returned = cursor.fetchall()
rows = [[i for i in j] for j in list(returned)]
for row in rows:
data.append(row)
print n, len(data)
预期:这将通过较小的部分快速处理较大的查询 发生:它比之前卡住的 3000 行更远,但经过一些迭代后最终撞到了墙上。同样不一致的是,运行脚本 10 次会导致 n 每次到达不同的点。
【问题讨论】:
你能估计一下桌子的大小吗?如果它是巨大的,那么超时是合理的。您能否在运行脚本时监控服务器进程,它可能会告诉您出了什么问题。进行计数操作以了解行数。 我会在运行时尝试 htop 监控。我用来调试这个问题的一个表是 100000 行,大约 85mb。 【参考方案1】:使用服务器端光标可能会获得更好的性能:
import MySQLdb.cursors
con = MySQLdb.connect(host=host,
user=user,
passwd=pwd,
charset=charset,
port=port,
cursorclass=MySQLdb.cursors.SSDictCursor);
cur = con.cursor()
cur.execute("SELECT * FROM wordpress.table")
for row in cur:
print row
您还可以查看对这些问题的回复:
How to get a row-by-row MySQL ResultSet in python
How to efficiently use MySQLDB SScursor?
【讨论】:
以上是关于在 MySQL 工作台正常工作的地方,Python MySQL 查询超时的主要内容,如果未能解决你的问题,请参考以下文章