Повышение производительности MySQL - InnoDB
Я работаю с Linux CentOS и MySQL, до сих пор это содержимое my.cnf:
sql_mode="NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER"
max_connections = 750
max_connect_errors = 750
connect_timeout = 28800
max_allowed_packet = 500M
character_set_server = utf8
query_cache_size = 500M
Я пытаюсь повысить производительность MySQL с помощью этих параметров, я читал, что некоторые из них устарели, поэтому я выбрал InnoDB в качестве движка и попытался установить его следующим образом:
default_storage_engine = INNODB
innodb_buffer_pool_size=9G
innodb_buffer_pool_instances=64
Итак, последний параметр my.cnf:
sql_mode="NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER"
max_connections = 750
max_connect_errors = 750
connect_timeout = 28800
character_set_server = utf8
default_storage_engine = INNODB
innodb_buffer_pool_size=6G
innodb_buffer_pool_instances=64
Но в конце сервер перегружается без использования всей доступной памяти (3 ГБ /8 ГБ, а не 6 ГБ /8 ГБ, как я ожидал от использования innodb_buffer_pool_size), и я должен перезапустить службу MySQL, чтобы восстановить и нормализовать состояние службы.
Как я могу реально улучшить производительность MySQL? или какие рекомендации вы можете дать мне?
Заранее спасибо.
2 ответа
Попробуйте установить innodb_flush_log_at_trx_commit=2
Дополнительную информацию можно найти здесь https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html
query_cache_size = 500M
убивает производительность.
Каждая запись в таблицу очищает все записи в КК для этой таблицы. И он выполняет эту задачу очень медленно для очень большого КК.
50M - это практический максимум для этого параметра.
И QC забирает память у buffer_pool InnoDB, где это может быть более полезным.
Если у вас нет других приложений на машине, и вы снизили QC, тогда 6G для buffer_pool на машине 8 ГБ должно быть в порядке. Следите за обменом - это ужасно для производительности.
Кроме того, только 6 для innodb_buffer_pool_instances
- 1G за экземпляр является рекомендацией.
connect_timeout
относится к отказу от установления соединения, а не к тому, как долго оно может оставаться рядом. 60
или менее разумно.
Но... Как правило, низкая производительность происходит из-за плохих индексов (особенно из-за отсутствия "составных" индексов, когда это необходимо) и скрытия индексированных столбцов внутри вызовов функций (например, WHERE DATE(created_at) = '...'
).
Итак, давайте посмотрим, какие запросы медленные.