Я хотел бы знать, как можно установить верхний предел объема памяти, используемой MySQL на сервере Linux.
Прямо сейчас MySQL будет занимать память с каждым новым запросом, так что в конечном итоге у него заканчивается память. Есть ли способ установить лимит, чтобы MySQL не использовал больше этой суммы?
Ответы:
Максимальное использование памяти MySQL во многом зависит от оборудования, ваших настроек и самой базы данных.
Оборудование
Аппаратное обеспечение - очевидная часть. Чем больше ОЗУ, тем веселее и быстрее диски ftw . Однако не верьте этим ежемесячным или еженедельным новостным письмам. MySQL не масштабируется линейно - даже на оборудовании Oracle. Это немного сложнее.
Суть в том, что не существует общего практического правила того, что рекомендуется для вашей установки MySQL. Все зависит от текущего использования или прогнозов.
Настройки и база данных
MySQL предлагает бесчисленное количество переменных и переключателей для оптимизации его поведения. Если вы столкнетесь с проблемами, вам действительно нужно сесть и прочитать руководство (f'ing).
Что касается базы данных - несколько важных ограничений:
InnoDB
,MyISAM
, ...)Большинство советов MySQL по stackoverflow расскажут вам о 5-8 так называемых важных настройках. Во-первых, не все из них имеют значение - например, выделение большого количества ресурсов для InnoDB и неиспользование InnoDB не имеет большого смысла, потому что эти ресурсы тратятся впустую.
Или - многие люди предлагают увеличить
max_connection
переменную - ну, мало ли они знают, это также означает, что MySQL выделит больше ресурсов для их обслуживанияmax_connections
- если когда-либо понадобится. Более очевидным решением может быть закрытие соединения с базой данных в DBAL или снижениеwait_timeout
чтобы освободить эти потоки.Если вы уловили мой тезис - действительно есть много, о чем можно прочитать и узнать.
Двигатели
Движки таблиц - довольно важное решение, многие люди забывают о них на раннем этапе, а затем внезапно обнаруживают, что борются с
MyISAM
таблицей размером 30 ГБ, которая блокируется и блокирует все их приложение.Я не хочу сказать, что MyISAM отстой , но
InnoDB
его можно настроить так, чтобы он отвечал почти или почти так же быстро, какMyISAM
и предлагает такую вещь, как блокировка строк,UPDATE
тогда какMyISAM
блокирует всю таблицу при записи.Если вы вольны запускать MySQL в своей собственной инфраструктуре, вы также можете проверить сервер percona, потому что, среди множества вкладов таких компаний, как Facebook и Google (они знают быстро), он также включает собственный Drop- в замен
InnoDB
, называетсяXtraDB
.См. Мою суть для настройки percona-server (и -client) (в Ubuntu): http://gist.github.com/637669
Размер
Размер базы данных очень и очень важен - хотите верьте, хотите нет, но большинство людей в Intarwebs никогда не занимались большими и интенсивными настройками MySQL, но они действительно существуют. Некоторые люди будут троллить и говорить что-то вроде: «Используйте PostgreSQL !!! 111», но давайте пока их проигнорируем.
Суть в том, что судя по размерам, решать аппаратную часть. Вы не можете заставить базу данных 80 ГБ работать быстро на 1 ГБ ОЗУ.
Индексы
Это не так: чем больше, тем лучше. Необходимо установить только необходимые индексы и проверить использование
EXPLAIN
. Добавьте к этому, что MySQLEXPLAIN
действительно ограничен, но это только начало.Предлагаемые конфигурации
Насчет них
my-large.cnf
иmy-medium.cnf
файлов - я даже не знаю, для кого они были написаны. Сверните свой собственный.Праймер для тюнинга
Отличное начало - тюнинг-праймер . Это сценарий bash (подсказка: вам понадобится linux), который принимает вывод
SHOW VARIABLES
иSHOW STATUS
и заворачивает его в полезнейшую рекомендацию. Если ваш сервер проработал какое-то время, рекомендация будет лучше, так как будут данные, на которых они будут основываться.Но тюнинг-праймер - не волшебный соус. Вам все равно следует ознакомиться со всеми переменными, которые он предлагает изменить.
Чтение
Мне очень нравится рекомендовать mysqlperformanceblog . Это отличный ресурс для всевозможных советов, связанных с MySQL. И дело не только в MySQL, они также много знают о подходящем оборудовании или рекомендуют настройки для AWS и т. Д. У этих ребят многолетний опыт.
Еще один отличный ресурс - это , конечно же, planet-mysql .
источник
tuning primer
, как это по сравнению сmysqltuner
?Мы используем эти настройки:
для сервера со следующими характеристиками:
источник
Использование памяти базы данных - сложная тема. Блог производительности MySQL делает хорошую работу покрытия на ваш вопрос, и списки много причин , почему это очень непрактично памяти «резерв».
Если вы действительно хотите установить жесткое ограничение, вы можете это сделать, но вам придется сделать это на уровне ОС, так как встроенной настройки нет. В linux вы можете использовать ulimit , но вам, вероятно, придется изменить способ запуска MySQL, чтобы наложить это.
Лучшее решение - настроить сервер так, чтобы сочетание обычных настроек памяти MySQL привело к снижению использования памяти вашей установкой MySQL. Это, конечно, отрицательно скажется на производительности вашей базы данных, но вы можете настроить
my.ini
следующие параметры:Я бы начал с этого и посмотрел, сможете ли вы получить желаемые результаты. Есть много статей о настройке памяти MySQL.
Редактировать:
Обратите внимание , что некоторые имена переменных изменились в новых версиях 5.1.x MySQL .
Например:
Сейчас:
источник
mysqld.exe использовал 480 МБ ОЗУ. Я обнаружил, что добавил этот параметр в my.ini
что уменьшило использование памяти с 400 000+ кбайт до 105 000 кбайт
источник
в
/etc/my.cnf
:Хорошая работа на сервере с памятью 256 МБ.
источник
table_definition_cache
= 0? Некоторое объяснение было бы неплохо. И вы в основном не кешируете запросы ... тот же эффект, если выquery_cache_type = 0
:)Если вы ищете оптимизацию своего контейнера docker mysql, вам может помочь следующая команда. Мне удалось запустить контейнер докеров mysql с 480 МБ по умолчанию до 100 МБ
docker run -d -p 3306: 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql: / var / lib / mysql --name mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --default-authentication-plugin = mysql_native_password
источник