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バイト)余分に利用されているのかは不明である。
このデータの性能データ
関連する考察データ