MySQL 行カウント SQL_CALC_FOUND_ROWS の効果

テーブルの件数を出力する際、Count関数を使ったときとSQL_CALC_FOUND_ROWSを使ったときを検証する。

スループット
※DB接続数を8とし、それぞれの接続から200回ずつクエリを実行した。



InnoDB Buffer Pool 利用率
テストクラス名 1回目 2回目 3回目 平均利用率(%)
SelectCounttemBenchmark 642/65536 642/65536 642/65536 0.98
SelectCalcFoundtemBenchmark 644/65536 644/65536 644/65536 0.98



測定データ
テストクラス名 1回目(ms) 2回目(ms) 3回目(ms) 平均(ms) スループット(tps)
SelectCountItemBenchmark 16236 16232 16210 16226.00 98.61
SelectCalcFoundItemBenchmark 9316 9361 9344 9340.33 171.30


SQL_CALC_FOUND_ROWSを使用することで、性能は70%近く向上している。

InnoDBを使用している時、Count(*)の処理は負荷が大きいといわれている。
SQL_CALC_FOUND_ROWSは、SELECT文と組み合わせて使用することで、対象のテーブルの件数をSELECTと同時にCOUNTする。そのため、通常は2回のSELECT文が必要な所を、1回のクエリで取得できるため、パフォーマンスが向上した。

InnoDBのメモリ領域の使用率については、わずかだが、チューニング後のほうが高かった。Buffer Poolには、データとインデックスが載っているが、何故SQL_CALC_FOUND_ROWSを利用した方が2ブロック(32kバイト)余分に利用されているのかは不明である。

このデータの性能データ

関連する考察データ

  • 関連する考察データは登録されていません。

コメント表示 コメント登録