2012-01-17 25 views
3

私はMySQLにアクセスするためにmysql.connector(MySQLdb Pythonの実装?)を使用します。カーソルからのselect文からの転送はそれほど高速ではありません。高速Python MySQL

コードをスピードアップする方法はありますか?

別のライブラリですか?どちら? (私はWindowsとPython 3.1を持っています) カーソルによる繰り返しとは異なる行検索があるかもしれませんか?

+1

なぜあなたはそれがクライアントライブラリであり、物事が遅くなるクエリではないと思いますか?それに加えて、いくつかのコードを表示します。 – ThiefMaster

+0

SQLブラウザーで同じクエリを起動する方がはるかに高速です。コードは広がっていますが、時間がかかりません。 SQLアクセスはできないがPythonコードにあれば、自分でそれを試してみよう。それはここでの質問ではありません。 – Gerenuk

答えて

10

デフォルトのMySQLdbカーソルは、クエリ結果全体をサーバから一度に取得します。このデータをPythonのタプルリストに変換すると、多くのメモリと時間が消費される可能性があります。

巨大なクエリを作成し、 の結果をサーバーから1つずつ取り出す場合は、MySQLdb.cursors.SSCursorを使用します。ただし、SSCursorを使用する場合、connectionno other query can be madeは、結果セット全体がフェッチされるまで保持されます。

import MySQLdb 
import MySQLdb.cursors as cursors 
connection = MySQLdb.connect(
    ... 
    cursorclass = cursors.SSCursor) 
cursor = connection.cursor() 
cursor.execute(query) 
for row in cursor: 
    ... 

あるいは、oursql、MySQLのための代替のPythonドライバを使用します。 oursqlの機能の1つは、fetchs rows lazilyです。

+0

ありがとう!興味深いヒント:)私はこれらの可能性を検討しようとします。 – Gerenuk

+0

executemanyのヒントはとても役に立ちました。さらに、fetchallはカーソルアクセスよりもかなり速いことに気付きました!私がまだ理解していないSSCursorのことですが、それを心に留めておきます:) – Gerenuk

+0

@unutbu mysqlはサーバ側のクエリをサポートしていますか?私はmysqlがすぐにレコードを取得するとレコードを1つずつ送ります。データをキャッシュしません。さもなければ、誰かがmysqlサーバを殺すには、大きなテーブルSSCursorを送信するだけで、mysqlサーバのメモリがなくなります。 –