Оптимальная MySQL-конфигурация (my.cnf)
ниже приведен мой файл конфигурации MySQL по умолчанию (my.cnf
) для чистой установки UTF-8 с InnoDB в качестве механизма хранения по умолчанию.
[server]
bind-address=127.0.0.1
innodb_file_per_table
default-character-set=utf8
default-storage-engine=innodb
настройка делает следующее:
- привязывается к localhost:3306 (loopback) вместо по умолчанию*: 3306 (все интерфейсы). Сделано для повышения безопасности.
- устанавливает одно табличное пространство за столом. Для повышения ремонтопригодности.
- задает набор символов по умолчанию в UTF-8. Сделал разрешить легкую интернационализацию по умолчанию.
- устанавливает механизм хранения по умолчанию InnoDB. Сделано, чтобы разрешить блокировку уровня строки по умолчанию.
предположим, что вы можете улучшить настройку, добавив максимум три (3) параметра конфигурации. Что бы вы добавили и почему?
улучшение в этом контексте будет означать либо улучшение производительности, повышение надежности или простоту использования / простоту обслуживания увеличение. Вы можете предположить, что машина, на которой работает экземпляр MySQL, будет иметь 1000 МБ ОЗУ.
3 ответов
кэшировать больше данных:
innodb_buffer_pool_size = 512M
Если вы пишете много данных:
innodb_log_file_size = 128M
, чтобы избежать слишком большого переключения журнала.
нет третьего, я бы добавил в любом случае, все остальные зависят.
выделение большего объема памяти, чем значение по умолчанию 8M для InnoDB (с использованием innodb_buffer_pool_size), безусловно, является улучшением. Что касается значения, на выделенном сервере базы данных, как ваш вы можете установить его до 80% вашего ОЗУ и чем выше вы установите это значение, тем меньше взаимодействия с жестким диском будет. Просто чтобы дать мои два цента, я хотел бы упомянуть, что вы можете иметь некоторое повышение производительности настройки значения innodb_flush_log_at_trx_commit
, однако, ущерба для соблюдения кислоты... Согласно руководство MySQL:
Если значение innodb_flush_log_at_trx_commit равно 0, буфер журнала записывается в файл журнала один раз в секунду и сброс операция to disk выполняется на лог-файл, но ничего не делается в фиксация транзакции.
Так вы можете потерять некоторые данные, которые не были записаны в базе, из-за аварии или неисправности. Снова в соответствии с руководством MySQL:
однако восстановление аварии InnoDB не затронуто и, таким образом, аварийное восстановление работает независимо от значения.
Итак, я бы предложил:
innodb_flush_log_at_trx_commit = 0
наконец, если у вас высокая скорость соединения (т. е. если вам нужно настроить MySQL для поддержки веб-приложения, которое обращается к базе данных), то вы должны рассмотреть вопрос об увеличении максимального количества соединений до чего-то вроде 500. Но поскольку это что-то более или менее тривиальное и хорошо известное, поэтому я бы хотелось бы подчеркнуть важность back_log
для обеспечения связи.
Я надеюсь, что эта информация поможет вам оптимизировать сервер баз данных.
Увеличьте размер буферного пула innodb, настолько большой, насколько вы можете это сделать:
innodb_buffer_pool_size=768M
Вам также понадобится ключевое буферное пространство для временных таблиц:
key_buffer_size=32M
другие будут зависеть от того, что вы делаете с базой данных, но table_cache или query_cache_size будут несколькими другими потенциалами.