2

現在実行しようとしている MySQL クエリは、機能的にはこれと同等です。

SELECT small_table.A, small_table.B, small_table.C, huge_table.X, huge_table.Y
FROM small_table LEFT JOIN huge_table
ON small_table.D = huge_table.Z
WHERE small_table.E = 'blah'

おそらく、2 番目のテーブルが巨大であるため (つまり、合計サイズが 3 MB の 7500 行)、クエリが終了していないように見えます (少なくとも妥当な時間内ではありません)。妥当な時間内に機能的に同等の結合を実行できますか、それとも巨大なテーブルから小さなテーブルに列を追加して冗長性を導入する必要がありますか? (私はSQLの初心者です。)

この句WHERE small_table.E = 'blah'は静的であり、変更されることはあり'blah'ません。

要求された EXPLAIN 出力は次のとおりです。

Array ( [0] => Array ( [0] => 1 [id] => 1 [1] => SIMPLE [select_type] => SIMPLE [2] => small_table [table] => small_table [3] => ref [type] => ref [4] => E [possible_keys] => E [5] => E [key] => E [6] => 1 [key_len] => 1 [7] => const [ref] => const [8] => 1064 [rows] => 1064 [9] => Using where [Extra] => Using where ) [1] => Array ( [0] => 1 [id] => 1 [1] => SIMPLE [select_type] => SIMPLE [2] => huge_table [table] => huge_table [3] => eq_ref [type] => eq_ref [4] => PRIMARY [possible_keys] => PRIMARY [5] => PRIMARY [key] => PRIMARY [6] => 4 [key_len] => 4 [7] => my_database.small_table.D [ref] => my_database.small_table.D [8] => 1 [rows] => 1 [9] => [Extra] => ) )

4

1 に答える 1

2

いくつかのこと...

1)このクエリをMySQL(Workbench GUIまたはコマンドライン)で直接実行していますか、それともこのクエリはPHPコードに埋め込まれていますか?EXPLAIN出力はPHPを示唆しているようです。まだ行っていない場合は、MySQLで直接クエリを実行してみて、PHPを組み合わせてください。

2)EXPLAINの出力は問題ないように見えますが、。WHEREを使用した句について疑問に思っている場合を除きますsmall_table.E = 'blah'。EXPLAIN出力は、列にインデックスがありますEが、キーの長さが1であることを示しています。これは、との比較と一致していません'blah'。の列定義にどのデータ型を使用しましたsmall_table.Eか?

3)MySQLは、small_tableで1064行をスキャンする必要があると推定しています。small_tableには合計行数があり、この特定のクエリに一致する行数はいくつになると思いますか?

于 2012-08-07T07:04:00.730 に答える