Существуют некоторые параметры, которые могут привести к тому, что временные таблицы материализуются как таблицы MyISAM или могут быть настроены на задержку. Имейте в виде , что для дисковых временных таблиц, нет никаких .frm
файлов, но только .MYD
и .MYI
файлов (конечно. Файл .MYI никогда не используется , так как невозможно индекс внутренней таблицы температуры).
Вот варианты:
Вы должны также рассмотреть документацию MySQL по использованию внутренней временной таблицы
Ситуации, когда создаются временные таблицы в памяти:
- Если есть предложение ORDER BY и другое предложение GROUP BY, или если ORDER BY или GROUP BY содержит столбцы из таблиц, отличных от первой таблицы в очереди соединения, создается временная таблица.
- DISTINCT в сочетании с ORDER BY может потребовать временную таблицу.
- Если вы используете опцию SQL_SMALL_RESULT, MySQL использует временную таблицу в памяти, если только запрос не содержит элементов (описанных ниже), которые требуют хранения на диске.
Когда временная таблица в памяти превысила минимум (tmp_table_size или max_heap_table_size), mysqld делает следующее:
- Приостанавливает запрос
- Копирует содержимое таблицы в памяти в временную таблицу MyISAM
- Сбрасывает таблицу в памяти
- Продолжает запрос, отправляя временные данные в временную таблицу MyISAM
Ситуации, когда временные таблицы в памяти игнорируются в пользу диска,
- Наличие столбца BLOB или TEXT в таблице
- Наличие любого столбца в предложении GROUP BY или DISTINCT размером более 512 байт.
- Наличие любого столбца размером более 512 байт в списке SELECT, если используется UNION или UNION ALL
Требуется некоторая должная осмотрительность, чтобы уменьшить создание временной таблицы на диске
- Установка join_buffer_size больше
- Установка sort_buffer_size больше
- Установка tmp_table_size и max_heap_table_size больше
- Настройка запросов для минимизации или даже предотвращения временных таблиц
- Создание индексов для создания предварительно отсортированного представления данных из отдельных таблиц
- Установка дополнительной оперативной памяти для размещения больших временных таблиц в памяти
Если после такой должной осмотрительности все еще создаются временные таблицы на диске, вот один отчаянный шаг: отображение создания временной таблицы на диске в память.
Вот быстрый и грязный способ установки 16 ГБ RAM-диска с помощью tmpdir
STEP01) Создать папку на диске RAM
mkdir /var/mysql_tmpfs
STEP02) Добавить это к my.cnf
[mysqld]
tmpdir=/var/mysql_tmpfs
STEP03) Добавьте это в / etc / fstab
echo "none /var/mysql_tmpfs tmpfs defaults,size=16g 1 2" >> /etc/fstab
STEP04) Перезагрузите / etc / fstab
mount -a
версии STEP05) service mysql restart
После этого все временные таблицы, которые становятся MyISAM, записываются на RAM-диск. Это должно ускорить создание временной таблицы на диске.
Попробуйте!
filesort
, и 6405 - это PID mysql, чтобы разделить временные файлы из разных экземпляров сервера.