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

Материал из poiuty wiki
Перейти к: навигация, поиск

Небольшой FAQ на тему оптимизации MySQL. Со временем будет наполняться.
Не стоит ставить рандомные значения. А так же менять много значений сразу.
Оптимальные значения подбираются в зависимости от железа и базы + на основе анализа.
Настройка и оптимизация MySQL не спасет вас от кривых запросов и быдло-кодеров.
Но заметно увеличит производительность вашего MySQL сервера.

libjemalloc

По умолчанию MySQL использует glibc. Ребята из percona, рекомендуют (link1 & link2), использовать libjemalloc.
Установим пакеты из репозитория.

apt-get install libjemalloc1 libjemalloc-dev

Отредактируем my.cnf в разделе [mysqld_safe] и перезапустим MySQL.

malloc-lib = /usr/lib/x86_64-linux-gnu/libjemalloc.so.1

tmpfs

Если *данные* не помещаются в буфер MySQL, то они будут записаны на диск во временную таблицу.
В итоге можно получить неплохую нагрузку на жесткие диски. По-этому перенесем временные таблицы в оперативную память.
Создаем директорию.

mkdir /var/mysql_tmpfs

Узнаем id пользователя и группы.

# id mysql
uid=110(mysql) gid=115(mysql) groups=115(mysql)

Редактируем /etc/fstab

tmpfs /var/mysql_tmpfs tmpfs rw,noatime,size=10%,uid=110,gid=115,mode=0700 0 0

Монтируем директорию.

mount /var/mysql_tmpfs

Редактируем my.cnf в разделе [mysqld]

tmpdir = /var/mysql_tmpfs

unix socket

Если у вас локальный MySQL, то не нужно гонять соединения через tcp. Быстрее будет работать через unix socket.
A Unix socket file connection is faster than TCP/IP, but can be used only when connecting to a server on the same computer, dev.mysql
Для этого в конфиге, подключения к базе данных, укажите localhost. Внимание! Именно localhost, а не 127.0.0.1
Дополнительно, вы можете отключить tcp соединения, для этого отредактируйте my.cnf в разделе [mysqld]

skip-networking

double cache

Чтобы избежать двойного кеширования (на уровне файловой системы и MySQL) - редактируем my.cnf в разделе [mysqld]

innodb_flush_method = O_DIRECT

disable swap

Общая рекомендация => отключить swap на сервере. MySQL не должен использовать swap.
Если вам не хватает памяти и вы считаете, что проблема исключено в железе - значит нужно покупать RAM.
В противном случае, может значительно увеличиться нагрузка на жесткие диски, далее вы получите тормоза всего сервера.
Редактируем /etc/sysctl.conf => после выполняем sysctl -p

vm.swappiness=0

Если по какой-либо причине вы не можете выключить использование swap => второй вариант, пусть mysql сразу заберет себе RAM.
Редактируем my.cnf в разделе в разделе [mysqld]

memlock