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

MySQLの「ORDER BY」に対するインデックス使用について質問です。
50万件程のテーブル「user」と10件程のテーブル「type」があり、
2テーブルを結合したクエリにORDER BYを使うとインデックスを張ってもusing filesortとなってしまいます。

問題のクエリはこちらです。
select * from user,type where user.type_id = type.id order by created_at DESC;
type_id…int型カラム
created_at…datetime型カラム

userテーブルへのインデックスを「created_at」に張り、複合インデックスを「type_id,created_at」に張っています。

これはORDER BYを上の形で使ってはいけないということなのでしょうか?
それとも私のインデックスの張り方やクエリがおかしいのでしょうか?

下記の記事で「自己結合」を行うことも検討しているのですが、
2つのテーブルに対する検索も行いたいため、できればインデックスで解決したいと思っています。
■MySQL の filesort プチテクニック
http://d.hatena.ne.jp/kazuhooku/20081208/1228707040

どうかお力添えをよろしくお願いします。

●質問者: alice99
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● lang_and_engine

インデックスの種類によりますが,type_idへの複合インデックスはほとんど意味をなしていないはずです。値が10件では…。
削除しましょう。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070919/282317/
>この例から言えることは、値の種類が少ないカラムにインデックスを付けても効果は得られない、ということです。[性別]のように2種類しかないデータはその典型ですが、[地域]カラムも値の種類は9種類しかなく、効果を得にくいカラムと言えそうです。


次にcreated_atのほうですが,数十万件に達している時点で単独テーブルでもfilesortは避けられないはずです。
DESCでソートするためのカラムを別途用意しておくという手があるので,下記URLをご参考に対処してみてください。
http://d.hatena.ne.jp/bco/20101225/1293282314


よかったら,この対処をする前後でexplainの出力が具体的にどう変化したか,ご報告して下さると嬉しいです。

関連質問

●質問をもっと探す●



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