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

mysqlデータのCSV出力

ガチンコ塾のブログでもかいたのですが、行動力が大切だなーと思う今日この頃。 社長が熟練のJavaエンジニアで基本的に聞けば、基本的に解決することが多いのですが、外部の勉強会などにも出て情報収集の必要性 …

no image

CASE+HAVING句

今回はCASEとHAVINGを組み合わせて、そこそこの難問を解いていきます。 まず下記のようなテーブル(testresults)があるとします。 student | class | sex | sco …

no image

SQL 集計関数の利用

先日同様、ある程度複雑な問題のSQLに関して。出典はSQL実践入門。 問題 下記のようなテーブル(テーブル名)で より古い年のデータが存在しない場合 NULL 直近の年のデータより売り上げが伸びた場合 …

no image

データベース設計のアンチパターン リトライ+バッチ分割+バッチの再利用不可

Contents1 リトライ1.1 デメリット1.2 対策2 バッチ分割2.1 デメリット2.2 対策3 バッチ再利用不可3.1 デメリット3.2 対策 リトライ ※OLTP=オンライントランザクショ …

no image

外部結合について 行列変換

今回から外部結合について学習します。 これはCASE式でもやった集合の考え方が大事になってきます。 例えば下記のようなテーブルCoursesとがあるとします。 name | course &#8212 …

アーカイブ