Почему MySQL использует сортировку файлов, когда нет ORDER BY?

#mysql #optimization

#mysql #оптимизация

Вопрос:

Все,

Я пытаюсь решить некоторые проблемы с производительностью, и я дошел до анализа этого запроса:

 EXPLAIN SELECT entry.entry_key, entry.node, entry.object_type, entry.object_id,
               entry.copy_id, entry.seq_number, entry.root_seq_number, entry.first_error,
               entry.last_error, entry.error_count, entry.error_id, entry.error_code,
               entry.status, entry.type, entry.sense, entry.reviewed 
       FROM eventlog me  JOIN eventlog_entry eventlog_entries 
            ON eventlog_entries.eventlog_key = me.eventlog_key  JOIN entry entry 
            ON entry.entry_key = eventlog_entries.entry_key 
       WHERE ( ( ( first_error >= '0' AND last_error <= '2147483640' ) AND 
                   me.eventlog_key = '1' ) ) 
       GROUP BY entry.entry_keyG
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: me
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: const
         rows: 1
        Extra: Using index; Using temporary; Using filesort
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: eventlog_entries
         type: ref
possible_keys: eventlog_entry_idx_entry_key,eventlog_entry_idx_eventlog_key
          key: eventlog_entry_idx_eventlog_key
      key_len: 8
          ref: const
         rows: 1
        Extra:
*************************** 3. row ***************************
           id: 1
  select_type: SIMPLE
        table: entry
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: eventlog.eventlog_entries.entry_key
         rows: 1
        Extra: Using where
3 rows in set (0.00 sec)
  

В исходном запросе действительно был an ORDER BY , но я его удалил. Тем не менее, EXPLAIN все еще сообщает о сортировке файлов, и я не могу понять, почему. Оптимизатор MySQL где-то кэшировал оптимизацию? Или сортировка файлов используется и по какой-то другой причине?

Ответ №1:

MySQL будет сортировать по умолчанию всякий раз, когда вы выполняете GROUP BY . Чтобы избежать этого, просто добавьте ORDER BY NULL .

Комментарии:

1. Это здорово. Из интереса, это где-нибудь задокументировано?

2. Нашел это в SELECT документации: «Если вы используете GROUP BY, выходные строки сортируются в соответствии со столбцами GROUP BY, как если бы у вас был ORDER BY для тех же столбцов. Чтобы избежать накладных расходов на сортировку этой ГРУППЫ ПО производимым, добавьте ORDER BY NULL »