Python MySQL查询MySQL工作台正常工作时超时

Python MySQL查询MySQL工作台正常工作时超时,python,mysql,mysql-workbench,mysql-connector-python,Python,Mysql,Mysql Workbench,Mysql Connector Python,我最近把我的网站移到了一个新的服务器上。我有一些基本的python脚本,可以访问MySQL数据库中的数据。在旧服务器上,我们没有问题。在新服务器上: MySQLWorkbench可以轻松连接并执行所有查询 使用python的相同(SELECT)查询在查询过程中有5%的时间工作,其余95%的时间超时或连接丢失 例如,该表有100000行,在MySQLWorkbench中选择整个内容就可以了。3秒钟后返回 在python中,相同的查询永远不会工作,当限制2999时,查询工作,但仅限制3010会导致

我最近把我的网站移到了一个新的服务器上。我有一些基本的python脚本,可以访问MySQL数据库中的数据。在旧服务器上,我们没有问题。在新服务器上:

  • MySQLWorkbench可以轻松连接并执行所有查询
  • 使用python的相同(SELECT)查询在查询过程中有5%的时间工作,其余95%的时间超时或连接丢失
  • 例如,该表有100000行,在MySQLWorkbench中选择整个内容就可以了。3秒钟后返回
  • 在python中,相同的查询永远不会工作,当限制2999时,查询工作,但仅限制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
您还可以查看对这些问题的答复:


您能估计一下桌子的大小吗?如果它是巨大的,那么超时是合理的。如果您在运行脚本时监视服务器进程,可能会了解出了什么问题。进行计数操作以了解行数。我将在运行时尝试htop监视。我用来调试这个问题的一个表是100000行,大约85mb。