2010-09-28
ORDER BY … LIMIT処理を最適化する
数万行のテーブルをORDER BYしているSQLが遅い。EXPLAINすると「Using Filesort」の文字が。
「Using Filesort」とは、テンポラリファイルを使ってソートしようとしているとの説明なので、INDEXでFetchできれば解決するようです。
ところが、
MySQL で ORDER BY の解決にインデックスを使用できない場合は以下のとおりです(この場合も MySQL は WHERE 節の条件に一致するレコードの検索にインデックスを使用します)。
- 複数のキーに対して ORDER BY を実行する場合。
> SELECT * FROM t1 ORDER BY key1,key2
- 連続しないキー部分に対して ORDER BY を実行する場合。
> SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2
- ASC と DESC が混在している場合。
> SELECT * FROM t1 ORDER BY key_part1 DESC,key_part2 ASC
- レコードの取り出しに使用されるキーが ORDER BY の実行に使用されるキーと異なる場合。
> SELECT * FROM t1 WHERE key2=constant ORDER BY key1
- ORDER BY で多くのテーブルとカラムを結合していて、それら全てがレコードの取り出しに使用される最初の非 const テーブルではない場合(これは EXPLAIN で出力される最初のテーブルで、かつ、const メソッドを使用していないテーブル)。
MySQL による ORDER BY の最適化
- ORDER BY と GROUP BY 式が異なる場合。
というわけで、MySQLのORDER BYするカラムにてINDEXを使うにはちょいと制限が多い。
まあ、バッチシ当てはまってしまった場合はどうしようもない。
と諦めかけていましたが、id:kazuhookuさんがテクニックを残しておいてくれてました。
ほんまにありがとうございます。
トラックバック - http://d.hatena.ne.jp/hi-hats/20100928/1285663190
リンク元
- 18 http://pipes.yahoo.com/pipes/pipe.info?_id=6ffca3d513899ee44c0d1201c766e92c
- 11 http://pipes.yahoo.com/pipes/pipe.info?_id=5c957097ed152660234169b605fb3fa7
- 7 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4SUNC_jaJP353JP354&q=3DES+php+復号化
- 4 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&channel=s&tbs=lr:lang_1ja&q=3des+php&aq=f&aqi=&aql=&oq=&gs_rfai=
- 4 http://www.google.co.jp/search?sourceid=chrome&ie=UTF-8&q=fork:+Cannot+allocate+memory
- 3 http://bugzero.shooti.jp/sitehead/http://d.hatena.ne.jp/hi-hats/20100605/1275738778
- 3 http://ezsch.ezweb.ne.jp/search/?query=キャパシティ設計&ct=0001&pd=1&sr=0002
- 3 http://www.google.co.jp/search?client=firefox-a&rls=org.mozilla:ja:official&channel=s&hl=ja&source=hp&q=orderby+limit&lr=&btnG=Google+検索
- 3 http://www.google.co.jp/search?hl=ja&lr=lang_ja&tbs=lr:lang_1ja&q=ssh+keepalive+.ssh&aq=f&aqi=&aql=&oq=&gs_rfai=
- 3 http://www.google.co.jp/search?q=キャパシティ・プランニング 概算 計算&hl=ja&ei=fu68TI2ALIW8vgO8koC1Cg&start=10&sa=N