Python MySQL查询超时,MySQL工作台可以正常工作

Cha*_*ith 5 python mysql mysql-workbench mysql-connector-python

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

  • 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()
Run Code Online (Sandbox Code Playgroud)

我在服务器上没有详细信息,但它具有足够的功能使MySQLWorkbench正常工作,只是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)
Run Code Online (Sandbox Code Playgroud)

预期:这将迅速解决较小的较大查询发生:它比之前固定的3000行要远,但经过一些迭代后最终碰到了墙。同样不一致的是,运行脚本10次会导致n每次到达一个不同的点。

小智 2

使用服务器端游标您可能会获得更好的性能:

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
Run Code Online (Sandbox Code Playgroud)

您还可以检查对这些问题的答复:

如何在Python中获取逐行MySQL结果集

如何高效使用MySQLDB SScursor?