11.04.2009 12:43EXPLAIN: filesort

В распоряжении MySQL есть несколько способов получить отсортированный результат. В EXPLAIN они отображаются как range, ref или index. Все они используют индекс для сортировки. Во всех прочих случаях используется filesort.

MySQL:
  1. mysql> EXPLAIN SELECT * FROM city ORDER BY Name;
  2. +----+-------------+-------+------+---------------+------+---------+------+------+----------------+
  3. | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra          |
  4. +----+-------------+-------+------+---------------+------+---------+------+------+----------------+
  5. 1 | SIMPLE      | city  | ALL  | NULL          | NULL | NULL    | NULL | 4079 | USING filesort |
  6. +----+-------------+-------+------+---------------+------+---------+------+------+----------------+
  7. 1 row in SET (0.00 sec)

Не смотря на название, к файлам этот алгоритм имеет мало отношения.

Filesort представляет собой ни что иное, как сортировку алгоритмом "quicksort". Сортируются блоки данных в памяти, размер которой контролируется переменной sort_buffer_size. Если данные не умещаются в одном блоке, filesort использует временный файл для хранения блоков.
Данные для сортировки всегда беруться только из одной таблицы. Если необходимо сортировать результаты запроса из нескольких таблиц MySQL собирает данные в одну временную таблицу и затем вызывает filesort.

Filesort имеет две формы:

  1. Сортируемые элементы содержат всю необходимую информацию. Результат сортировки представляет собой линейный список результатов запроса. В данном случае нет необходимости обращаться к исходной таблице снова.
  2. Сортируются пары <sort_key, rowid>, что дает последовательность идентификаторов строк, которые используются для получения данных из исходной таблицы в необходимом порядке. Но это в свою очередь приводит к чтению таблицы в случайном порядке, что не слишком быстро.

В случаях, когда невозможно применить первый вид алгоритма MySQL использует второй. Например если сортируемые значения содержат типы BLOB или поля переменной длинны. К сожалению EXPLAIN не показывает разницы между этими двумя алгоритмами.

Похожие записи:

Комментариев нет | Рубрики: MySQL

Post Your Comment

Немного о себе




Комментарий

*