11.04.2009 12:43EXPLAIN: filesort
В распоряжении MySQL есть несколько способов получить отсортированный результат. В EXPLAIN они отображаются как range, ref или index. Все они используют индекс для сортировки. Во всех прочих случаях используется filesort.
-
mysql> EXPLAIN SELECT * FROM city ORDER BY Name;
-
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
-
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
-
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
-
| 1 | SIMPLE | city | ALL | NULL | NULL | NULL | NULL | 4079 | USING filesort |
-
+----+-------------+-------+------+---------------+------+---------+------+------+----------------+
-
1 row in SET (0.00 sec)
Не смотря на название, к файлам этот алгоритм имеет мало отношения.
Filesort представляет собой ни что иное, как сортировку алгоритмом "quicksort". Сортируются блоки данных в памяти, размер которой контролируется переменной sort_buffer_size. Если данные не умещаются в одном блоке, filesort использует временный файл для хранения блоков.
Данные для сортировки всегда беруться только из одной таблицы. Если необходимо сортировать результаты запроса из нескольких таблиц MySQL собирает данные в одну временную таблицу и затем вызывает filesort.
Filesort имеет две формы:
- Сортируемые элементы содержат всю необходимую информацию. Результат сортировки представляет собой линейный список результатов запроса. В данном случае нет необходимости обращаться к исходной таблице снова.
- Сортируются пары <sort_key, rowid>, что дает последовательность идентификаторов строк, которые используются для получения данных из исходной таблицы в необходимом порядке. Но это в свою очередь приводит к чтению таблицы в случайном порядке, что не слишком быстро.
В случаях, когда невозможно применить первый вид алгоритма MySQL использует второй. Например если сортируемые значения содержат типы BLOB или поля переменной длинны. К сожалению EXPLAIN не показывает разницы между этими двумя алгоритмами.
Комментариев нет | Рубрики: MySQL