$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

MySQLのfilesortは何ソートで行われているのか


 CourseraArgorithms, Part1MySQLORDER BYfilesort使調

 調調MySQL

調査結果

最初に調査結果を書いておく。たぶんこれは非常に単純化したもので、詳しく見るともっといろいろチューニングされてそう。

  • sort_buffer_size以内のメモリ量でソートが可能な場合、メモリ内でのみソートされる
  • ソートにsort_buffer_size以上のメモリが必要な場合、sort_buffer_sizeでメモリが足りる単位でメモリ内ソートが行われ、それぞれの結果を一時ファイルに書き出す。最後に一時ファイルからマージソートする
  • メモリ内のソートには、クイックソートか、Priority Queueを使ったTop-kソートが用いられる
  • ソートしなければならない行数が、最終的に必要な行数の3倍を超える時、Priority Queueを使ってソートされる。そうでなければクイックソートが使われる

filesortは基本的にクイックソートマージソートの組み合わせ


MySQL :: MySQL 5.6  :: 8.2.1.15 ORDER BY  filesortfilesort2

 


1. WHERE 
2.  (ID) 
3.  qsort (quicksort) 
4. 
5.  MERGEBUFF (7) 12
6.  MERGEBUFF2 (15) 
7.  ID () 
8. ID使ID使 read_rnd_buffer_size  sql/records.cc 
 

 


sort_buffer_sizequicksort

quicksort




 使+

メモリ内のソートはクイックソートでなく、Priority Queueを使ったソートが使われる時もある(?)


 filesort Priority Queue sorthttps://github.com/mysql/mysql-server/blob/567bb732bc0e2de38f10c1793dcc0a0c6f877742/sql/filesort.cc#L1313 

 Priority Queue使nkTop-k sort使O(n * log(k))O(n * log(n))nkPriority Queue使

 WHERE(n)LIMIT(k)Priority Queue使

 


Priority Queue3

LIMIT3Priority Queue使




 調...

まとめ


 MySQLfilesort調MySQL