Python MySQLdbを使用して大きなテーブルからデータをフェッチするときに、非常に長い実行時間(長いフェッチ時間とは対照的に)があり、明らかに間違っているかどうかを知りたいと思います。Python MySQLdbが遅く実行する
次のように私のテーブルが定義されている:
create table mytable(
a varchar(3),
b bigint,
c int,
d int,
e datetime,
f varchar(20),
g varchar(10),
primary key(a, b, c, d))
ENGINE=InnoDB;
それが現在1.5億行が含まれており、テーブルサイズの見積もりは19ギガバイトです。 execute
コマンドに費やす時間から来
import MySQLdb
database = MySQLdb.connect(passwd="x", host="dbserver", user="user", db="database", port=9999)
mysql_query = """select a, b, c, d, e, f, g from mytable use index (primary) where a = %s order by a, b, c, d"""
mysql_cursor = database.cursor()
mysql_cursor.execute(mysql_query, ["AA"])
for a, b, c, d, e, f, g in mysql_cursor:
#Do something
私の驚きを次のように
ザ・Pythonのコードがあります。 execute
は、ほとんどの時間を費やすことはない(主キーを使用してテーブルを移動する必要があるため)、そしてfor
ループでかなりの時間を費やしているとは思うが、ここでは古くからの歳月を費やしている。
実行計画は次のとおりです。
現時点でexplain select a, b, c, d, e, f, g from mytable use index (primary) where a = %s order by a, b, c, d
'1','SIMPLE','eventindex','ref','PRIMARY','PRIMARY','5','const','87402369','Using where'
は、すべての行が(私は後で他の値を追加するために念頭に置いていた列に同じ値が含まれていますが、現時点列の分布で、コンテンツは実際にはバランスが取れていません)。列bがより良く分散されています
MySQLはクエリの実行に時間を費やしています(行をフェッチする時間を費やすのではなく)と説明できますか?
ボーナスの質問です。このユースケースを最適化するための明白な迅速な勝利?カラムbのテーブルを分割する?列a?列aを削除し、代わりに別のテーブルを使用しますか?