5

最近、ウェブサイトを新しいサーバーに移動しました。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()

サーバーの詳細はわかりませんが、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 が毎回異なるポイントに到達します。

4

1 に答える 1

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

これらの質問への回答も確認してください。

Python で行ごとの MySQL ResultSet を取得する方法

MySQLDB SScursor を効率的に使用するには?

于 2016-08-17T23:33:02.577 に答える