QKAKE::TECH

テックなことを書く

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

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