Mysql – диск в памяти для временных таблиц.

Ответить
admin
Администратор
Сообщения: 198
Зарегистрирован: 05 янв 2011, 04:19

Mysql – диск в памяти для временных таблиц.

Сообщение admin »

Для нескольких типов SQL запросов MYSQL создает промежуточные таблицы. Таблицы могут быть созданы как в памяти, так на жестком диске. Естественно при большой интенсивности запросов операции записи/чтения временных таблиц на жестком диске могут стать узким местом всей базы данных. Как проверить, есть ли проблемы?

Первым делом нужно проверить является ли mysql узким местом всего приложения. Для этого достаточно посмотреть есть ли «медленные» запросы.

Mysql> SHOW GLOBAL STATUS LIKE ‘Slow_queries’;

Если число Slow_queries достаточно велико, нужно задуматься об оптимизации чего-то в работе СУБД или в применяемых запросах. Различных узких мест может быть масса, но описанная проблема с временными таблицами встречается часто. Есть ли проблема у вашей базы? На этот вопрос поможет ответить все тот же GLOBAL STATUS:

mysql> show global status like ‘%Created_tmp%’;

Запрос покажет две переменные, Created_tmp_disk_tables и Created_tmp_tables. Первое значение показывает число временных таблиц, созданных на жестком диске, второе исключительно в памяти. Можно составить простую пропорцию, для получения процентного соотношения всех временны таблиц и таблиц, созданных на жестком диске:

X = (Created_tmp_disk_tables * 100)/ (Created_tmp_disk_tables + Created_tmp_tables)

Если X больше 5-10 процентов, то уже стоит задуматься об оптимизации в этом направлении.

Самым первым делом можно увеличить значения max_heap_table_size и tmp_table_size, если это не поможет, можно пойти дальше — заменить раздел жесткого диска, на котором создаются временные таблицы на диск в памяти.
Как создать диск в памяти в Linux есть вот в этой заметке.
Теперь нужно указать новый путь для временных таблиц в mysql, добавляем в my.cnf:

tmpdir = /mnt/tmpfs

MySQL гарантировано будет создавать временные таблицы на диске в случаях если:

присутствует BLOB или TEXT столбец в таблице;
размер колонки при использовании GROUP BY или DISTINCT больше 512 байт;
размер колонки в выводе SELECT, при использовании UNION или UNION ALL больше 512 байт.
Ответить