Kaketan::Tech

誰かのためになるかもしれないテックなことに関するメモを書いています。

【MySQL】Using filesort について調べた

▼ 宣伝 ▼

これを読んでいるあなた!HP制作・アフィリエイトサイト制作に興味ありませんか?

現在、コーポレートサイトやアフィリエイトサイトの制作、月額課金制のファンクラブ制作などを行っています。

新しい収益源・集客ツールとしてのWeb制作はお任せください!「Kaketan::Tech を見た」で特別価格にてご案内いたします。

詳細は こちら のお仕事一覧をご覧ください!

プログラミング学習支援サロンのご紹介

フリーランスエンジニアの私が、あなたがプログラマとして案件を獲得できるようになるまでサポートいたします。詳細は こちら をクリック!

▲ 宣伝 ▲

Using filesort とは

  • MySQL のクエリの実行計画をみたときに、Extra 列に Using filesort; と表示されること。
  • インデックスを利用しないクイックソートが用いられていることを示している。

なにが問題か

  • Using filesortはインデックスを利用しないクイックソートにより速度が低下する。
    • filesort が何ソートなのかは以下が詳しい。

blog.shibayu36.org

いつ発生するのか

  • ORDER BY 句があるときに適切なインデックスがないと Using filesort が出る。
  • ソートに必要なメモリが sort_buffer_size より大きくなったとき。
    • テンポラリファイルが作られ、メモリとファイルを併用してクイックソートが実行される。
    • ちゃんとインデックスが利用されるようにして、インデックス順で行をフェッチできるようにすれば filesort は不要である。

どう解決するか

mysql>EXPLAIN SELECT name, type, from users WHERE type = 3; 

上記でクエリの実行計画をみて、適切にインデックスが貼られているか確認する。複数のカラムにまたがるクエリの場合、複合インデックスを追加するなどする。

mysql>EXPLAIN SELECT name, type, from users WHERE type = 3 \G 

末尾に \G をつけると結果が縦に表示されてみやすくなるっぽい。

refs