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

SQL基礎 手続き型言語と集合思考の言語

どんな仕事でもそうだと思いますが、長年惰性で使っていると日常の作業はなんとかできてるけど、実は深く理解していない&効率のいいやり方を知らない、ということが結構あります。 私の場合、ちょっと前にCSSを …

no image

サブクエリの使い方

以前も少し学習しましたが、今回からはサブクエリの扱い方です。特に異なった行の比較(年度計算など)に関して行われる自己結合をつかったものが非常に強力です。 例によってここを学習しています。 下記のような …

no image

SQL結合 サブクエリに関して

今回はサブクエリに関してです。 もちろんSQL実践入門を読み進めています。 SQL上ではテーブル、ビュー、サブクエリというのは機能的にはそれほど変わらず主にパフォーマンスの点で違いがでてきます。 以下 …

no image

GlassFishでDB接続

JavaEEではアプリケーションサーバーとしてGlassFishを使いますが、先日、GlassFishを通さないとJavaEEでDBが動かせないということを知りました。そのためJavaEEではデータベ …

no image

CakePHPでの数字カンマ区切り&PHP&MySQL曜日の出力

今回は主に時間やお金の表示など、出力に関するネタです。 Contents1 Cakeでのカンマ区切り1.1 単純なカンマ区切り 例1,0001.2 \をつけるケース 例 \1,0001.3 円をつける …

アーカイブ