Что установить innodb_buffer_pool и почему ..?

20

У меня есть 170 ГБ InnoDBиндекса и данных.

Я должен перенастроить размер innodb_buffer_pool для лучшей производительности. Максимальный размер таблицы таблицы InnoDB (индекс + данные) составляет 28 ГБ.

Итак, какой должен быть оптимальный размер innodb_buffer_pool.

ОБНОВИТЬ

мы собираемся перенести нашу локальную базу данных в ec2, поэтому установим оперативную память в соответствии с текущей статистикой innodb, поэтому мне нужен размер буферного пула, чтобы мы могли иметь доступную оперативную память там.

Файл на таблицу включен.

Я использую Linux-машину.

Абдул Манаф
источник
Какая доступная оперативная память на машине не используется другими процессами? Вы используете Windows, Linux или что-то еще? Какую версию MySQL вы используете? Почему размер таблицы ограничен 28 ГБ?
Крейг Эфрейн
Размер таблицы не ограничен. Я дал размер таблицы до одного момента времени. Он будет увеличиваться, так как в будущем будут вставки.
Абдул Манаф

Ответы:

25

Самая большая таблица у вас составляет 16,47% (28/170) от общего объема данных. Даже если таблица была хорошо написана и прочитана, не все 28G таблицы загружаются в пул буферов в один данный момент. Вам нужно рассчитать, сколько буферного пула InnoDB загружено в любой момент на текущем сервере БД .

Вот более детальный способ определения innodb_buffer_pool_size для нового Сервера БД с учетом набора данных, загруженного в текущий момент в буферном пуле InnoDB текущего Сервера БД.

Запустите следующее на своем текущем экземпляре MySQL (сервер, с которого вы мигрируете)

SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_data';  -- IBPDataPages 
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_total'; -- IBPTotalPages
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- IPS

Запустите формулу IBPPctFull = IBPDataPages * 100.0 / IBPTotalPages.

SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPTotalPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_total'); -- SELECT @IBPTotalPages;
SET @IBPPctFull = CAST(@IBPDataPages * 100.0 / @IBPTotalPages AS DECIMAL(5,2));
SELECT @IBPPctFull;

Если IBPPctFull равен 95% или более, вы должны установить innodb_buffer_pool_size равным 75% ОЗУ БД-сервера.

Если IBPPctFull составляет менее 95%, запускать эту формулу: IBPSize = IPS X IBPDataPages / (1024*1024*1024) X 1.05.

SET @IBPSize = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_page_size'); -- SELECT @IBPSize;
SET @IBPDataPages = (SELECT VARIABLE_VALUE FROM information_schema.global_status WHERE VARIABLE_NAME = 'Innodb_buffer_pool_pages_data'); -- SELECT @IBPDataPages;
SET @IBPSize = concat(ROUND(@IBPSize * @IBPDataPages / (1024*1024*1024) * 1.05, 2), ' GB' );
SELECT @IBPSize;

Число для IBPSize (в ГБ) - это число, которое больше соответствует вашему фактическому рабочему набору данных.

Теперь, если размер IBPSize все еще слишком велик для самой большой конфигурации Amazon EC2 RAM, используйте 75% RAM для сервера Amazon EC2 DB.

RolandoMySQLDBA
источник
Это действительно полезная информация. Еще мне нужно знать, как MySQL Server загружает данные и индексы в пул буферов. Я просмотрел документацию и узнал, что он использует LRU, но как он загружает их в память, например, если у меня есть 2 ГБ для буферный пул, но размер таблицы, который запрашивается в запросе, намного больше, чем это. ??
Абдул Манаф
В пул буферов загружаются только страницы данных и индексов, необходимые для удовлетворения запроса, а не вся таблица. Старые страницы данных и индексов
чередуются
Абдул, ты должен идти с ответом Роландо, который отвечает на твой вопрос лучше, чем мой. Я собираюсь переписать свой собственный ответ только потому, что мне нужно быть более ясным.
Крейг Эфрейн
13

Я предоставляю этот ответ в качестве дополнительной информации к ответу Роландо ниже.

Прежде чем сервер находится в производстве

Рассчитайте innodb_buffer_pool_size на основе самых больших таблиц, которые чаще всего используются MySQL. Чтобы идентифицировать самые большие таблицы в зависимости от их размера в базе данных, вы можете использовать этот скрипт:

select table_schema, table_name, round(data_length/1024/1024,2) as size_mb 
from information_schema.tables where table_schema like 'my_database' 
order by size_mb desc;


+--------------+-------------------------+---------+
| table_schema | table_name              | size_mb |
+--------------+-------------------------+---------+
| heavybidder     | user                 |   522.55|
| heavybidder     | bid                  |   121.52|
| heavybidder     | item_for_sale        |    10.52|
| heavybidder     | account_user         |    5.02 |
| heavybidder     | txn_log              |    4.02 |
| heavybidder     | category             |    0.02 |
+--------------+-------------------------+---------+

Теперь, когда мы знаем, какие таблицы являются самыми большими в нашей базе данных, нам нужно определить, какие из них используются чаще всего. Для этого я бы использовал программу профилирования, такую ​​как Jet Profiler (JP), чтобы посмотреть, к каким таблицам обращаются чаще всего. JP покажет вам, к каким таблицам обращаются чаще всего. Вот скриншот из этого раздела в JP

введите описание изображения здесь

Поэтому теперь я знаю, что таблицы пользователей и ставок занимают около 640 МБ дискового пространства, они очень часто используются в соответствии с JP, а это означает, что MySQL будет хранить свои индексы и данные в буферном пуле как Rolando. упоминает ниже в своих комментариях.

Чтобы убедиться, что в MySQL достаточно памяти для хранения данных для моих самых больших и наиболее часто используемых таблиц, я бы определил innodb_buffer_pool_size размером 640 МБ.

Есть некоторые дополнительные соображения, но они не относятся к innodb_buffer_pool_size.

Это 32-битная или 64-битная система? В 32-битной системе вы ограничены 4 ГБ, если не активируете PAE. В Windows это означает использование выпусков Windows Enterprise или Datacenter.

Сколько памяти нужно другим процессам, работающим в вашей системе? На выделенном сервере MySQL я оставлю от 5% до 10% для ОС. В Windows вы можете использовать Process Explorer для анализа использования памяти. В Linux у вас есть sysstat, free, htop, top и vmstat.

База данных состоит только из таблиц Innodb или смеси Innodb и MyISAM? Если это смесь из двух, то я выделю память для key_cache, переменных объединения, кеша запросов и т. Д. Позже вы сможете рассчитать коэффициент попадания MyISAM, когда сервер будет запущен.

После того, как сервер находится в производстве

Каков текущий коэффициент попадания для Innodb?

1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests).

Что такое коэффициент попадания в кэш ключа?

1 - (Key_reads / Key_read_requests)

Обычно я стараюсь получить соотношение как можно ближе к 100%.

Насколько хорошо ваши таблицы помещаются в буферный пул

Вы также можете посмотреть, насколько хорошо данные вашей таблицы вписываются в ваш buffer_pool, обратившись к этой ссылке, которая предоставляет способ показать, «сколько страниц в пуле буферов для данной таблицы (cnt), сколько из них грязно (грязно)» и какой процент индекса умещается в памяти (fit_pct). " Относится только к серверу Percona

http://www.mysqlperformanceblog.com/2010/12/09/how-well-does-your-table-fits-in-innodb-buffer-pool/

Крейг Эфрейн
источник