Python MySQL 查询超时,MySQL workbench 工作正常
Python MySQL queries time out where MySQL workbench works fine
我最近将我的网站移到了新服务器上。我有一些基本的 python 脚本,可以访问 MySQL 数据库中的数据。在旧服务器上,我们没有遇到任何问题。在新服务器上:
- MySQLWorkbench 可以轻松连接并执行所有查询
- 具有 python 的相同 (SELECT) 查询有 5% 的时间有效,而其他 95% 的时间在查询期间超时或连接丢失
- 例如 table 有 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 每次都到达不同的点。
使用服务器端游标可能会获得更好的性能:
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?
我最近将我的网站移到了新服务器上。我有一些基本的 python 脚本,可以访问 MySQL 数据库中的数据。在旧服务器上,我们没有遇到任何问题。在新服务器上:
- MySQLWorkbench 可以轻松连接并执行所有查询
- 具有 python 的相同 (SELECT) 查询有 5% 的时间有效,而其他 95% 的时间在查询期间超时或连接丢失
- 例如 table 有 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 每次都到达不同的点。
使用服务器端游标可能会获得更好的性能:
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?