MYSQLの5.2で

TEST1~17までカラムがあるテーブルAがありまして
そちらに3000万レコードあるとします。
テーブルAはパーティショニングしていてうまくデータの
分散はうまくいってます。

TEST1~5までがPRIMARYとして設定して
TEST8にINDEXを張ってます。

SELECTを行って、EXPLAIN PARTITIONSで確認したところ
きちんと、パーティショニングしたテーブル一個に対して
TEST8のINDEXを使用して実行されているのですが
この、TEST8の値が、複数ある時は、INでまとめて
取得するようにしてます。

その際に、INの数が10と100で、SELECTの実行時間に
違いがありすぎるのですが、何かいい方法ないでしょうか?

抽出する際に、ソート順のカラムがTEST12にある為、
該当のデータをソートして抽出する為、どうしても
TEST8の値100個でも実行しないといけません。

あまり説明がうまくなくてすいません。

回答の条件
  • 1人2回まで
  • 登録:2010/01/15 00:03:41
  • 終了:2010/01/22 00:05:02

回答(3件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402010/01/15 02:42:16

ポイント27pt

抽出する際に、ソート順のカラムがTEST12にある為、

該当のデータをソートして抽出する為、どうしても

TEST8の値100個でも実行しないといけません。

何を言っているのかさっぱり分かりません。


TEST8,TEST12 の複合カラムインデックスを作成すれば良いという話?


さし当たり、サンプルの SQL 分と EXPLAIN 結果を例示してもらえれば

もう少し具体的な話が出来るのですが。

MySQL :: MySQL 5.1 リファレンスマニュアル :: 6.2.1 EXPLAINを使用して、クエリを最適化する

id:hopefully

TEXPLAIN 結果だけなら貼り付けれます。

EST8の値が10個の場合

id select_type table partitions type possible_keys key key_len ref rows Extra

1 SIMPLE TESTA p01_p01sp22 range TEST8 TEST8 47 NULL 976 Using where; Using temporary; Using filesort

TEST8の値が384個の場合

d select_type table partitions type possible_keys key key_len ref rows Extra

1 SIMPLE TESTA p01_p01sp22 range TEST8 TEST8 47 NULL 39282 Using where; Using temporary; Using filesort

結局、rowsの値が多きくなるとなるだけ、データ抽出が多くなるから

しょうがないのでしょうか?

2010/01/15 17:00:03
id:ayakasi08 No.2

ayakasi08回答回数172ベストアンサー獲得回数62010/01/15 06:41:30

ポイント27pt

unionをつかって1回のINを10個に固定すると良いかも

id:hopefully

これは、検証してみますね。

ありがとうございます。

2010/01/15 17:00:29
id:Mook No.3

Mook回答回数1312ベストアンサー獲得回数3912010/01/17 10:57:54

ポイント26pt

コメントが無効なので、回答で失礼します。


どのような環境で使用しているのか分かりませんが、表示結果を全データから件数(COUNT(*))にしても

実行結果に差があるでしょうか。


検索の時間というより、検索結果の送受信時間の差が出ているということはありませんか。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません