オフセットの後半になると急に遅くなる MySQLの高速化

MySQLはオフセットの後半になると急に遅くなる。
例えば1,000,000件(100万件)のレコードがあったとき最後のほうの30件だけをとる場合は

SELECT * FROM `test` LIMIT 999970 , 30;
30 rows in set (7.8739 sec)

7.8秒もかかる。

比較のために最初の30件をとると

SELECT * FROM `test` LIMIT 30;
30 rows in set (0.0012 sec)

1秒かからない。

このような処理の場合、プライマリキーがあってIDの抜けがないならオフセットよりもプライマリキーを条件に入れたSQL文の方が速い。

SELECT * FROM `test` WHERE `test_id` >999970 LIMIT 30;
30 rows in set (0.0011 sec)

ソート順がないからでは?と思う人もいると思うのでちゃんとOrder Byを付けてみると

SELECT * FROM `test` ORDER BY `test_id` ASC LIMIT 999970 , 30;
30 rows in set (7.9203 sec)

SELECT * FROM `test` WHERE `test_id` >999970 ORDER BY `test_id` ASC  LIMIT 30;
30 rows in set (0.0016 sec)

もちろん最終行周辺をとるなら逆順にソートしても速い。

SELECT * FROM `test` ORDER BY `test_id` DESC LIMIT 30;
1 row in set (0.0014 sec)

関連記事

スポンサーリンク

親要素のマージン幅によってはclearが効かない

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る