Оптимизация настроек InnoDB по умолчанию


8

Я посмотрел в my.ini и увидел различные настройки по умолчанию. Моя база данных работает на одном автономном компьютере. Я хочу оптимизировать производительность InnoDB и MySQL в целом для производительности. Нет ограничений на дисковое пространство. Какие настройки по умолчанию следует изменить, чтобы оптимизировать их для повышения производительности, надежности и возможных резервных копий на определенный момент времени [высокая доступность].

Edited

В настоящее время всякий раз, когда я запускаю «Оптимизировать таблицы» с помощью обслуживания на MySQL Administrator, он показывает:

Таблица не поддерживает оптимизацию, вместо этого выполняется воссоздание + анализ

на всех столах. Все мои таблицы InnoDB, но почему они не поддерживают Оптимизацию?


это редактирование требует отдельного вопроса, IMO. Взгляните на документацию OPTIMIZE TABLE: dev.mysql.com/doc/refman/5.5/en/optimize-table.html InnoDB поддерживает команду, но процесс отличается от MyISAM
Дерек Дауни

Ответы:


11

Способ настройки InnoDB сосредоточен вокруг

  • InnoDB Buffer Pool: кэширует страницы данных и страницы индекса. Объем данных и индекса, который вы можете кэшировать, является не функцией ограничений дискового пространства, а функцией доступной памяти и дискового пространства, которые в настоящее время используются InnoDB.
  • Метаданные InnoDB: по умолчанию файл ibdata1 обычно содержит все и вся InnoDB. Это будет включать страницы данных, страницы индекса, метаданные таблицы, данные MVCC .

Вот формула, которую я использовал в течение последних 5 лет для вычисления пула буферов InnoDB на основе дискового пространства, используемого страницами данных и индексов InnoDB :

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(Power1024<0,0,
IF(Power1024>3,0,Power1024)))+0.49999),SUBSTR(' KMG',IF(Power1024<0,0,
IF(Power1024>3,0,Power1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 2 Power1024) B;
  • Использовать (ВЫБРАТЬ 0 Power1024) для байтов
  • Использовать (ВЫБРАТЬ 1 Power1024) для КБ
  • Использовать (ВЫБРАТЬ 2 Power1024) для МБ
  • Использовать (ВЫБРАТЬ 3 Power1024) для ГБ
  • Используйте (ВЫБРАТЬ 4 Power1024) для ТБ (напишите мне, если у вас есть TerraBytes RAM)

Конечно, я сказал, что функция доступной памяти и дискового пространства в настоящее время используется InnoDB. Отсюда, просто используйте здравый смысл. Рекомендуемое число из вышеприведенного запроса не должно превышать 75% установленной оперативной памяти !!! Это простое практическое правило для определения размера пула буферов InnoDB.

Вам также следует установить innodb_flush_method в O_DIRECT, поскольку он обеспечит стабильную синхронную запись InnoDB. Я также написал пост о том, как оптимизировать дисковое хранилище для InnoDB .

Что касается сообщения Таблица не поддерживает оптимизацию, вместо этого выполняется воссоздание + анализ , то причина, по которой вы получаете это сообщение об ошибке, заключается в том, что механизм хранения - InnoDB. Механически OPTIMIZE TABLE просто копирует таблицу во временную таблицу и выполняет ANALYZE TABLE .

В действительности, ANALYZE TABLE против InnoDB совершенно бесполезен. Даже если вы запустили ANALYZE TABLE для таблицы InnoDB, механизм хранения InnoDB снова и снова выполняет погружения в индекс для приближений мощности, таким образом уничтожая только что скомпилированную статистику. Фактически, Percona провела несколько тестов на ANALYZE TABLE и пришла к тому же выводу .

Вот другие сообщения, которые я сделал за год о настройке InnoDB


Мой компьютер имеет 2 ГБ оперативной памяти, а InnoDB_Buffer_Pool_Size по умолчанию установлено на 6M. Я увеличил его до 500М. Какие-либо предложения?
RPK

Установите 1536M, то есть 1,5G, так как это 75% установленной оперативной памяти
RolandoMySQLDBA

Я выполнил ваш запрос, и он выдает 45G. Оперативная память на моем сервере составляет 8 ГБ. Нужно ли мне увеличивать объем оперативной памяти? Или есть некоторые условия для вышеуказанного запроса ..
Stewie

@ Stewie Если у вас 45 ГБ InnoDB, 60 ГБ ОЗУ - это то, что вам нужно, если у вас есть бюджет. Поскольку у вас только 8G, 75% установленной оперативной памяти (6G) достаточно.
RolandoMySQLDBA

@RolandoMySQLDBA: отличный пост! Но я не совсем понимаю, почему в случае Стьюи его оперативная память составляет всего 8 ГБ, но вывод его запроса может быть больше, чем 8 ГБ (в данном случае 45 ГБ.) Не могли бы вы просветить?
Чубака

3

Вот старая статья о важных переменных для грубой настройки. Наиболее важным, вероятно, являетсяinnodb_buffer_pool_size

Я очень рекомендую обновить до MySQL 5.5 (если вы его еще не используете). Они внесли несколько изменений в производительность InnoDB. Они даже предоставляют основной раздел о том, как оптимизировать InnoDB теперь, когда это движок по умолчанию: http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb.html

Что касается резервного копирования на определенный момент времени, вы захотите посмотреть двоичный журнал . Основы включения этого - установить log-binпеременную в вашем my.cnf


Я обновился до MySQL 5.5.
РПК

2

Оптимизация приходит во многих цветах.

Я думаю, что ваш первый шаг должен решить, что значит «оптимизировать» для вас. Для некоторых это означает «самые быстрые запросы SELECT». Для других это означает «лучший баланс между производительностью SELECT и производительностью INSERT». Для других - «самая высокая производительность INSERT».

Вы должны решить, каковы ваши критерии и как вы собираетесь определить, помогают ли ваши изменения, прежде чем приступить к настройке.

Затем поместите ваши файлы конфигурации и параметры запуска под контроль версий и начните экспериментировать. Документируйте, чьему совету вы следуете и где вы его нашли (Советы со временем меняются по мере изменения кодовой базы и оборудования.) Также поместите эти документы под контроль версий.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.