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:主キーのリーフノードにいけばレコードが丸ごと手に入るアレ