7

phpMyAdminとMySQLdb(python)の両方で次のクエリを実行しました。

SELECT *, (SELECT CONCAT(`id`, '|', `name`, '|', `image_code`)
FROM `model_artist` WHERE `id` = `artist_id`) as artist_data, 
FIND_IN_SET("metallica", `searchable_words`) as find_0
FROM `model_song` HAVING find_0

phpMyAdminによると、クエリには2ミリ秒かかりました。私のPythonコードによると、MyPythondbを使用すると、クエリに848msかかりました(結果をフェッチすることすらありません)。

Pythonコード:

self.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ibeat")
self.cur = self.db.cursor()

millis = lambda: time.time() * 1000

start_time = millis()
self.cur.execute_cmd("""SELECT *, (SELECT CONCAT(`id`, '|', `name`, '|', `image_code`)
FROM `model_artist` WHERE `id` = `artist_id`) as artist_data, 
FIND_IN_SET("metallica", `searchable_words`) as find_0
FROM `model_song` HAVING find_0""")
print millis() - start_time
4

2 に答える 2

15

SQLクエリに大きな結果セットがあり、レコードごとに反復することを計画している場合は、デフォルトのカーソルの代わりにMySQLdbSSCursorの使用を検討することをお勧めします。デフォルトのカーソルは結果セットをクライアントに格納しますが、SSCursorは結果セットをサーバーに格納します。デフォルトのカーソルとは異なり、レコードを1つずつ繰り返すだけであれば、SSCursorに大きな初期遅延は発生しません。

SSCursorの使用方法に関するサンプルコードは、ここにあります。

たとえば、次のことを試してください。

import MySQLdb.cursors

self.db = MySQLdb.connect(host="localhost", user="root", passwd="", db="ibeat",
                          cursorclass = MySQLdb.cursors.SSCursor)

(残りのコードは同じままにすることができます。)

于 2011-05-13T15:56:08.577 に答える
5

PHPMyAdminはすべてのクエリに制限を設けているため、インターフェイスで大きな結果セットが返されることはありません。したがって、クエリが通常1,000,000行を返し、PHPMyAdminがそれを1,000(またはデフォルトの値)に減らす場合、Pythonが結果セット全体を取得またはクエリするときに処理時間が大幅に長くなることが予想されます。

時間を比較するには、PHPMyAdminの制限と一致する制限をPythonに設定してみてください。

于 2011-05-13T15:49:27.597 に答える