Python MySQL查询MySQL workbench工作正常的时间

我最近把我的网站搬到了新的服务器上.我有一些基本的
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每次都达到不同的点.

最佳答案 使用服务器端游标可能会获得更好的性能:

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?

点赞