SQL_CALC_FOUND_ROW本当に高速なのかしら
http://dev.mysql.com/doc/refman/5.1/ja/information-functions.html
SELECT SQL_CALC_FOUND_ROWS を使用している場合、MySQL は完全な結果セットにいくつ行があるか計算する必要があります。しかし、結果セットをクライアントに送る必要がないため、LIMIT なしでクエリを再度実行するより速く行えます。
とあるけど、InnoDBでプライマリキーがidとなっているクラスタインデックス*1になっているテーブルから行を取得する場合でちょっと考えてみる
select * from hoge where other_idx = 'fuga'; みたいにインデックス以外のカラムも取得する場合、HDDへのアクセスが最低でも3回行われている気がします。
- other_idxが格納されているノードへアクセス
- other_idxに主キーが格納されているので主キーのノードへアクセス
- 主キーのノードからリーフノードへたどると全データ取得
SEE ALSO: http://www.inter-office.co.jp/contents/170/
これが count(*) from hoge where other_idx = 'fuga'だった場合は
- other_idxが格納されているノードへアクセス
の1回だけのアクセスで済むはず。
で、このケースでSELECT SQL_CALC_FOUND_ROWSでLIMIT以降も取得される結果セットというのはHDDに何回アクセスして求めているんだろうか、という疑問です。
うーん。どっちだろう。教えてください通りすがりの方。今回はこの質問をしたいだけの記事だという。
まあほとんどのケースでSQL_CALC_FOUND_ROWのほうが有効なんでしょうけど中で何やってるのか知りたいのです。
*1:主キーのリーフノードにいけばレコードが丸ごと手に入るアレ