skillup

技術ブログ

Database

MySQLのLIMIT,OFFSETに関して&explainの見方など

投稿日:

自作のWEBアプリを作っていたところSELECT句が異常に遅いケースがありました。

発見までにかなり時間がかかったんですが、不可思議な現象としてはOFFSETが小さいときと大きいときで検索スピードが全然違うんですよね・・・

試しにexplainで調べてみるとrowのところの数値がoffsetの数がそのまま入っていました。(つまりoffsetの倍数そのままになります。)

てっきりORDER BYにindexが貼られて入れば、0件目でも100万件目でも全く変わらないと思っていましたが、実は違うようです。

対策としては下記のような感じでしょうか。

  • idなどの連続する値の場合はbetweenで挟む
  • offsetの始点にwhere条件を切り替えて検索する

OFFSETを使わない高速なページネーションの実現

あとは遅い原因の絞り込み方としてはexplainの活用がメインになりますね。

【MySQL】遅いselect文の原因を調査する【explainの読み方】

  • 基本rowsの数を少なくすることが目的
  • indexが適切に貼られているか、使われているか(explainのkeyをみて値が適切かどうかを見ましょう。)

自分の場合ですが、indexが適切に貼られているにも関わらずjoinを使った場合、型が片方はintもう片方はvarcharで高速化できない、ということがありましたまあ珍しいケースではあると思いますが、遅い場合には見ておきましょう。

 

-Database
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

NOT EXISTSの利用2

今回もNOT EXISTSの利用です。 前回の問題にプラスアルファし、列が一緒でないと連続でも意味ない仕様にします。 例えば下記のようなテーブルがあるとします。 seat | row_id | sta …

no image

正規化のデメリット

Contents1 正規化のデメリット2 本日のSQL 正規化のデメリット 正規化についていろいろ書いてきましたが、メリットもあればデメリットもあります。 メリットとしては データの不整合が起きにくい …

no image

MySQLのSETとFIND_IN_SETについて

MySQLの方ですが、単純な文字列や、数字、日付の他に配列に近いSET型、また5.7以降ではJSONなどを入れることができます。 Contents1 SET型2 FIND_IN_SET SET型 いわ …

no image

Postgres リモートホストからの接続他

今まで使ってきたデータベースはMySQLがほとんどなのですが、最近少し、Postgresを触っています。 今回はパスワードの設定とリモートからの接続など。 Contents1 postgresへのログ …

no image

HAVING句について

本日はHAVINGについて。 かろうじて用法はしっており、たまに使うこともありますが、あまりしっかり理解しているとはいえない状況ですので、掘り下げてみようと思います。 WHEREとは違い、抽出した結果 …