Що встановити 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-сервера 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, використовуйте 75% оперативної пам’яті для сервера DB Amazon EC2.


Це дійсно чудова інформація. Ще одне, що мені потрібно знати, як MySQL Server завантажує дані та індекси в буферний пул, я пройшов документацію і зрозумів, що він використовує LRU, але як він завантажує їх у пам'ять, як, якщо у мене є 2 Гб для буферний пул, але розмір таблиці, який запитується в запиті, набагато більше, ніж це .. ??
Абдул Манаф

У буферний пул завантажуються лише сторінки даних та покажчики, необхідні для задоволення запиту, а не всю таблицю. Старі сторінки даних та покажчики повертаються на основі алгоритму LRU, вказаного в dev.mysql.com/doc/refman/5.5/uk/innodb-buffer-pool.html
RolandoMySQLDBA

Абдул, ти мусиш піти з відповіддю Роландо, який відповідає на твоє питання краще, ніж на моє. Я збираюся переписати власну відповідь лише тому, що мені потрібно бути зрозумілішим.
Крейг Ефрейн

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.

Це 32Bit або 64bit система? У системі 32Bit ви обмежені 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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.