Русский
Русский
English
Статистика
Реклама

Оптимизация mysql комплексная

Доброго времени суток, уважаемые хабровчане.

Сегодня речь пойдет опять и снова про mySQL. Разберемся в оптимизации и поговорим про множество параметров сервера.
Давайте приступать.

Начало


Сервер у нас пусть будет на CentOS. Оптимизировать будем методом правки конфига my.cnf .

Настройка некоторых параметров может повысить
производительность БД сервера в несколько раз!

Для начала давайте определимся, что мы вообще оптимизируем т.е сколько каких таблиц на каком движке имеем, какая железка у нас есть и под какие параметры мы будем всё это дело подгонять.
Для этого возьмем htop (как красивый и наглядный инструмент):

yum install htop

Выведем htop :

htop


Получаем нечто такое:
Запишем себе в my.cnf:

# 3 ядра, 4гб оперативной памяти 

Теперь давайте узнаем количество таблиц и их типы.
Для этого возьмем mysql tuner:

wget https://raw.github.com/major/MySQLTuner-perl/master/mysqltuner.pl

Запустим:
perl mysqltuner.pl

Вывод примерно:
image

Запишем себе в my.cnf:
# 64M myisam, 770M innoDB

Типовой конфиг обычно рекомендуют какой-то такой:
[client] port                        = 3306 socket                      = /var/run/mysqld/mysqld.sock [mysqld_safe] socket                      = /var/run/mysqld/mysqld.sock nice                        = 0  [mysqld] user                        = mysql pid-file                    = /var/run/mysqld/mysqld.pid socket                      = /var/run/mysqld/mysqld.sock port                        = 3306 basedir                     = /usr datadir                     = /var/lib/mysql tmpdir                      = /tmp language                    = /usr/share/mysql/english old_passwords               = 0 bind-address                = 127.0.0.1  skip-external-locking  max_allowed_packet          = 16M key_buffer_size             = 16M innodb_buffer_pool_size     = 2048M innodb_file_per_table       = 1 innodb_flush_method         = O_DIRECT innodb_flush_log_at_trx_commit  = 0  max_connections             = 144    <a href="http://personeltest.ru/aways/ruhighload.com/query_cache_size+%d0%bf%d0%b0%d1%80%d0%b0%d0%bc%d0%b5%d1%82%d1%80+%d0%b2+mysql" target="_blank" style="color: rgb(232, 95, 99);">query_cache_size</a> = 0 slow_query_log              = /var/log/mysql/mysql-slow.log long_query_time             = 1  expire_logs_days            = 10 max_binlog_size             = 100M  [mysqldump] quick quote-names max_allowed_packet          = 16M

Теперь давайте разбираться, что мы будем оптимизировать здесь, зачем, как и почему (особенно почему этих параметров маловато.

Оптимизация и конфиг


Для начала можно пролистать в конец вывода mysql tuner и посмотреть, что же он там рекомендует. В нашем случае это выглядит как-то так:
wget https://raw.github.com/major/MySQLTuner-perl/master/mysqltuner.pl perl mysqltuner.pl

image

Не будем заниматься бездумной подстановкой, а пройдемся по параметрам mysql , которые могут нас интересовать в первую очередь. Что к чему:
skip-external-locking, убирает внешнюю блокировку, что быстрее;
skip-name-resolve , позволяет MySQL избегать ответа на запрос DNS при проверке подключения клиентов к серверу MySQL .
Таким образом, сервер MySQL будет использовать только
IP -адреса, а не имена хостов, что немного, но быстрее.
binlog_cache _ size, размер кэша для хранения изменений в двоичном журнале. Задает размер только для кэша транзакций. Сделаем 100M больше не нужно.

innodb_stats_on_metadata = 0 (OFF), для ускорения работы с
INFORMATION_SCHEMA, SHOW TABLE STATUS или SHOW INDEX отключим обновление статистики при выполнении таких операций

quer y _cache_size = 128M и query_сache_type
= 1
, кэши запросов. 1 в принципе включен, 128M ограничение. Не
рекомендуется ставить выше 256M , т.к это может привести к блокировке.
Так как у нас большеInnoDB таблиц, то зануляем cache _ size .
С версии MySQL 5.6 query_cache_size отключен, а с версии 8.0 удален

Стандартно все таблицы и индексы хранятся в одном файле, поэтому используем innodb_file_per_table = 1.

Значение innodb_open_files и table_open_cache рекомендуется устанавливать обе опции в 4096 или 8192 . А вообще рассчитывается как количество таблиц во всех базах, умноженное на 2 , ориентировочно.

При работе с InnoDB является важнейшим параметр innodb_buffer_pool_size , он устанавливается по принципу чем больше, тем лучше. Рекомендуется выделять до 70-80% оперативной памяти сервера.

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

ВНИМАНИЕ!При изменении параметра innodb_log_file_size остановите MySQL, сделайте резервную копию файлов ib_logfile-n (файлы чаще всего лежат в /var/lib/mysql/), измените значение параметра innodb_log_file_size и запустите MySQL. В результате
MySQL создаст новый лог-файл указанного в конфигурации размера.


Установка большого размера innodb_log_file_size может привести к увеличению быстродействия, но при этом увеличится время восстановления данных, выберите от 256M до 1G .

innodb_log _ buffer_size размер буфера транзакций. Обычно рекомендуется не применять, если не используете BLOB и TEXT больших размеров.

innodb_flush _ method, определяет логику сброса данных на диск. В современных системах при использовании RAID и резервных узлов, вы будете выбирать между ODSYNC и ODIRECT, первый параметр быстрее, второй безопаснее.

key_buffer _ size буфер для работы с ключами и индексами, и sort_buffer буфер для сортировки. Если Вы не используете MyISAM таблицы, рекомендуется установить размер key_buffer_size в 32Мб для хранения индексов временных
таблиц.

Параметр thread_cache _ size указывает количество тредов (threads), уходящих в кеш при отключении клиента. При новом подключении тред не создается, а берется из кеша, что позволяет экономить ресурсы при больших нагрузках.

innodb_flush_log_attrx_commit, может повысить пропускную способность записи данных в базу в сотни раз. Он определяет, будет ли Mysql сбрасывать каждую операцию на диск (в файл лога).

innodb_flush_log_at_trx_commit = 1 используется для случаев,
когда сохранность данных это приоритет номер один.

innodb_flush_log_at_trx_commit = 2 для случаев, когда небольшая потеря данных не критична. Есть еще 0 (ноль) самый производительный, но небезопасный вариант.

max_connections если вы получаете ошибки " Too many connections ", эту опцию стоит увеличить. А так большой пользы в оптимизации от неё нет.

Количество потоков ввода/вывода файлов в InnoDB задается опциями innodb_read_io_threads , innodbwrite_io_threads, обычно этому параметру присваивается значение 4 или 8 , на быстрых SSD -дисках установите в 16. Значение innodb_thread_concurrency установите в количество ядер * 2 .

Конфиг получается вот такой:

[client] port                        = 3306 socket                      = /var/run/mysqld/mysqld.sock  [mysqld_safe] socket                      = /var/run/mysqld/mysqld.sock nice                        = 0  [mysqld] user                        = mysql pid-file                    = /var/run/mysqld/mysqld.pid socket                      = /var/run/mysqld/mysqld.sock port                        = 3306 basedir                     = /usr datadir                     = /var/lib/mysql tmpdir                      = /tmp language                    = /usr/share/mysql/english old_passwords               = 0 bind-address                = 127.0.0.1  skip-external-locking  skip-name-resolve  binlog_cache_size = 100M thread_cache_size = 32  innodb_stats_on_metadata = OFF  query_cache_limit = 1M query_cache_size = 0 query_cache_type = 1  innodb_buffer_pool_size = 3G innodb_log_file_size = 256М innodb_log_buffer_size = 6M innodb_additional_mem_pool_size = 16M innodb_flush_method = O_DSYNC innodb_flush_log_at_trx_commit = 0 innodb_thread_concurrency = 6 innodb_file_per_table = 1  key_buffer_size = 32M tmp_table_size = 64M max_connections = 350 sort_buffer_size = 16M read_buffer_size = 1M read_rnd_buffer_size = 1M join_buffer_size = 8M thread_stack = 1M binlog_cache_size = 8M  tmp_table_size = 128M table_open_cache = 2048  [mysqldump] quick quote-names max_allowed_packet = 16M
,

Ну и напоследок можно посмотреть рекомендации тюнера и последовать им.

Заключение


Вот такой вот интересный конфиг получился. Если Вам сложно, то на первых порах стоит пользоваться mySQL калькулятором, который подскажет основные параметры и позволит не выходить за пределы доступной памяти как-никак всё упирается в неё:

Спасибо за внимание. Присоединяйтесь к обсуждению.,
Источник: habr.com
К списку статей
Опубликовано: 29.01.2021 02:04:02
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Mysql

Администрирование баз данных

Оптимизация mysql

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru