人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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個でも実行しないといけません。

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

●質問者: hopefully
●カテゴリ:就職・転職 コンピュータ
✍キーワード:INDEX MySQL SELECT ありす カラム
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●27ポイント

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

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

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

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


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


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

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

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

◎質問者からの返答

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の値が多きくなるとなるだけ、データ抽出が多くなるから

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


2 ● ayakasi08
●27ポイント

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

◎質問者からの返答

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

ありがとうございます。


3 ● Mook
●26ポイント

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


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

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


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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ