Задать вопрос

MySQL и память

Как узнать что именно съедает память в MySQL?

точнее сказать в чем причина большого потребления памяти MySQL сервером?

много таблиц?
большие размеры таблиц?
много индексов?

на сколько я понял MySQL в памяти хранит индексы, а сама БД лежит в файлах.
  • Вопрос задан
  • 24495 просмотров
Подписаться 9 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
rakot
@rakot
Возникает пара вопросов, кто вам настраивал MySQL и какой тип таблиц вы используете?

Всё же навскидку могу сказать, что память уходит скорее всего из-за скортировок по неключевым полям. MySQL выделяет память под сортировку на каждое соединение, по умолчанию 8 мегабайт, память выделяется как только приходит запрос с сортировкой, причем выделяется сразу вся порция внезависимости от того, надо вам 100кб под данную операцию или все 8 мегабайт.

Во время нагрузки посмотрите SHOW FULL PROCESSLIST.
По сложным запросам посмотрите EXPLAIN.

Несколько стратегий:
1. Добавлять ключи для выборок и сортировок, если это приемлимо и их еще нет.
2. Увеличивать шансы на попадание запросов в кеш MySQL.
3. Кешировать данные на уровне приложения.
4. Перенести некоторые операции на уровнь приложения.
Ответ написан
@egorinsk
Проверьте число макс. соединений и потоков (процессов на линуксе) MySQL. Сами понимаете, что каждый из требует память.

Проверьте выставленные значения key_buffer_size (исп. MyISAM, один буфер на все потоки), thread_stack (стек нужен каждому потоку), net_buffer_length (свой у каждого потока), read_buffer_size (у каждог опотока свой), read_rnd_buffer_size, sort_buffer, pool_buffer_size, как вам выше написали.

Вообще, MySQL довольно предсказуемая система и ест столько памяти, сколько ей скажут. Ссылочка dev.mysql.com/doc/refman/5.0/en/memory-use.html вам в помощь.

Перестаньте пользоваться нехорошему вещами, вроде JOIN или fulltable row scan на больших таблицах. Они все тоже едят память, да еще как.
Ответ написан
Комментировать
@nmike
Вообще, если используете только иннодб, память там сьедается файлом буфера данных-его принято выставлять до80% от доступной оперативной — innodb_buffer_pool_size. В нем храниться страницы с данными и индексами, что бы не лазить лишний раз на медленный диск, а обращаться всегда к оперативке.
А все остальные буфера-это крохи по сравнению с этим(если конечно мы говорим о сервере с гигами оперативки:) )
Ответ написан
Adam_Ether
@Adam_Ether
Java Developer
Много запросов?)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы