Настройка других опций MySQL

transaction_isolation

Уровень изоляции транзакций. Значение REPEATABLE-READ не покажет внутри транзакции новые данные, добавленные в другой транзакции. READ-COMMITED - наоборот, позволяет читать внутри транзакции данные, изменённые в других транзакциях.

Большинству приложений важна целостность и непротиворечивость данных, поэтому они используют базу данных как транзакционную (OLTP). В таком случае лучше использовать значение REPEATABLE-READ.

Если же приложение использует базу данных для аналитических запросов, то лучше подойдёт значение READ-COMMITED.

Бывают и приложения со смешанной логикой. Например, Zabbix хранит в базе данных как собственную конфигурацию, что больше соответствует OLTP, так и исторические данные со значениями определённых показателей в конкретные моменты времени, что больше соответствует OLAP. Но, т.к. нужно обеспечить непротиворечивость данных конфигурации, то запросы к таблицам истории тоже придётся выполнять на уровне изоляции транзакций REPEATABLE-READ.

transaction_isolation = REPEATABLE-READ

Для уверенности стоит поискать настройки, рекомендуемые разработчиками приложения. Если информации найти не удалось, более безопасным выбором будет REPEATABLE-READ.

innodb_file_per_table

Настройка, предписывающая хранить каждую таблицу базы данных в отдельном файле. Перед её выставлением необходимо сделать резервную копию всех баз данных. Чтобы настройка вступила в силу, нужно:

  1. остановить MySQL,
  2. удалить файлы ibdata1, ib_logfile0 и ib_logfile1,
  3. запустить MySQL снова,
  4. восстановить базы данных из резервных копий.

При восстановлении данных MySQL поместит каждую таблицу в отдельный файл.

Когда данные таблиц находятся в отдельных файлах, можно сравнительно легко вернуть в файловую систему место, освободившееся в таблице при удалении данных. Для этого достаточно запустить команду OPTIMIZE TABLE или ALTER TABLE ... FORCE над таблицей, которую нужно ужать. В случае, если используется общее хранилище для всех таблиц, неиспользуемое место никогда не возвращается на диск.

Есть у раздельного хранения данных таблиц и отрицательная сторона: при большом количестве таблиц (и секций таблиц, если они есть) увеличивается время запуска сервера MySQL.

Также операционная система обычно ограничивает количество одновременно открытых одним пользователем файлов, то серверу MySQL может потребоваться закрывать неиспользуемые файлы, чтобы открыть нужные и уложиться в этот лимит. Этот недостаток можно смягчить использованием настройки table_cache, описанной ниже, и изменением ограничений со стороны операционной системы.

Если у базы данных небольшой размер, а работать MySQL придётся на каком-нибудь микрокомпьютере, то возможно не стоит хранить данные таблиц в отдельных файлах. Ещё лучше в подобных случаях будет воспользоваться какой-нибудь встраиваемой базой данных, например, SQLite.

innodb_file_per_table = 1

table_open_cache и innodb_open_files

Опция table_open_cache ограничивает количество одновременно открытых файлов таблиц. Увеличение значения позволяет уменьшить количество открытий-закрытий файлов. Стоит оценить количество файлов в каталоге, где хранятся файлы с данными MySQL и выставить значение равного порядка.

table_open_cache = 512

Опция innodb_open_files имеет такой же смысл, что и опция table_open_cache, но относится только к движку InnoDB. По умолчанию эта опция принимает значение 300, а если включена опция innodb_file_per_table, то принимает значение, равное table_open_cache.

Стоит учитывать, что операционная система ограничивает количество одновременно открытых одним пользователем файлов и значение, указанное в опции, не должно быть больше разрешённого операционной системой лимита.

skip_name_resolve

При каждом подключении сервер MySQL выполняет поиск доменного имени компьютера клиента по его IP-адресу. Это может вызывать задержки при подключении. Для отключения поиска доменного имени по IP-адресу можно выставить в настройках сервера MySQL опцию следующего вида:

skip_name_resolve = 1

Стоит, однако, учитывать, что эту опцию можно безболезненно включать только если у каждого пользователя прописан IP-адрес, с которого он может подключаться, или указано одно из значений: % - любой узел или localhost - локальное подключени. Перед включением опции стоит выяснить IP-адреса пользователей и заменить доменные имена ими.

event_scheduler

Настройка, включающая встроенный в сервер MySQL планировщик задач. Позволяет по расписанию запускать запросы или хранимые процедуры:

event_scheduler = 1

query_cache_size и query_cache_type

Кэш результатов прошлых запросов. Если содержимое таблиц, фигурирующих в запросе, не менялось с момента кэширования результата предыдущего такого же запроса, то этот кэш позволит серверу сразу выдать клиенту результат запроса из кэша:

query_cache_size = 64M

Если содержимое таблиц постоянно меняется, а вероятность повторного выполнения запроса низка, то отключение этого кэша никак не скажется на производительности СУБД, но позволит сэкономить немного оперативной памяти. Для отключения кэша запросов можно указать такие опции:

query_cache_type = 0
query_cache_size = 0

general_log_file

Общий журнал. Содержит, например, сведения о запусках и остановках сервера.

general_log_file = /var/log/mysql/mysql.log

log_error

Журнал ошибок:

log_error = /var/log/mysql/mysql.err

log_warnings и log_error_verbosity

Не выводить предупреждающие сообщения в журнале ошибок:

log_warnings = 0

Начиная с MySQL 5.7.2 опция log_warnings объявлена устаревшей и вместо неё следует использовать опцию log_error_verbosity, которая принимает значения от 1 до 3:

  1. Выводить только сообщения об ошибках,
  2. Выводить сообщения об ошибках и предупреждения,
  3. Выводить сообщения об ошибках, предупреждения и информационные сообщения.

Таким образом, для отключения вывода в журнал предупреждений можно воспользоваться такой опцией:

log_error_verbosity = 1

slow_query_log, slow_query_log_file, long_query_time, log_queries_not_using_indexes, log_slow_admin_statements

Сервер может вести журнал медленных запросов. Для этого нужно включить журнал медленных запросов, указать его расположение и указать минимальную длительность запросов, которые будут попадать в журнал, в секундах:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slowquery.log
long_query_time = 10

Для поиска запросов, не использующих индексы, можно включить соответствующую опцию:

log_queries_not_using_indexes = 1

Для того, чтобы в журнал медленных запросов попадали запросы DDL, манипулирующие структурой таблиц и индексами, можно включить соответствующую опцию:

log_slow_admin_statements = 1

character-set-server и collation-server

Настройка кодировки сервера по умолчанию и настроек сортировки и сравнения символов:

character-set-server = utf8
collation-server = utf8_general_ci

Использованные материалы