спосіб запобігти запитам очікування блокування рівня таблиці


10

Ми зіткнулися з проблемою після переміщення бази даних нашого клієнта на додатковий сервер. Це повинно було мати позитивний вплив на продуктивність сайту, але існує проблема з блокуванням таблиці в MyISAM. (Я чув про використання InnoDB замість MyISAM, але ми не можемо змінити двигун найближчим часом).
Ми можемо помітити його на запит на оновлення, який виконується, коли модератор активує коментар до статті. Це процес:

  • оновлення-запит обробляється SET status = 1 WHERE id = 5(індекс встановлюється)
  • кешовані файли сторінки видаляються

У цей момент вся сторінка стає повільною. Сама база даних зайнята хвилин. Я кілька разів вибирав список процесів і бачив близько 60 записів різних селекційних запитів, які були в штаті, очікуючи блокування рівня таблиці .

1. Я не розумію, чому це оновлення в таблиці article_commentsможе вплинути на оператори select для таблиці, articleщоб чекати блокування рівня таблиці. У списку процесів майже всі запити очікування були з цієї таблиці. Я читав про те, що оновлення / вставки вважають за краще вибирати і що це може спричинити такі проблеми, але сама таблиця статей не оновлюється, коли коментарі стають активованими, тому вибір не повинен чекати. Невже я це зрозумів?
2. Чи є щось, крім того, щоб змінити InnoDB, щоб запобігти такій поведінці або принаймні для покращення балансу? Мене дуже дратує те, що ця проблема не з’явилася перед переміщенням бази даних на новий сервер. Я думаю, що є якась неправильна конфігурація, але я не знаю, як ідентифікувати.


1
Увімкніть загальний журнал і слідкуйте за операторами JOIN між цими таблицями. Коли ви вибираєте, це створює неявну ЧИТАТИ БЛОКУ. Оскільки MYISAM не підтримує блокування ROW LEVEL, він блокується на рівні таблиці. Це, мабуть, випадок, коли це блокування відбувалося на старому сервері, але його ніхто не спостерігав? Порівняйте лінію my.cnf для лінії між хостами та особливо переконайтесь, що ваш key_buffer налаштований належним чином.
випадковий

У нас було кілька інших проблем із продуктивністю на старому сервері, і ми часто переглядали список процесів. В основному було багато спальних процесів, але ми ніколи не помічали тих, хто чекав (я бачив цю інформацію взагалі вперше на цьому новому сервері). Мій колег скопіював старий my.cnf і скоригував значення на нове існуюче обладнання, але записів було не так багато. Я також порівняв результати "SHOW VARIABLES", але насправді не знав, на що дивитись. Завтра ми повторно перевіримо клавішу, дякуємо за ваш коментар.
32bitfloat

Нещодавно у нас була схожа проблема. Спочатку наш key_buffer_sizeбув налаштований на 1GB. Збільшуючи це, щоб 10GBзменшити проблему.
Галюк

@ Рік Джеймс, дякую. Ти сьогодні врятував мені багато клопоту. Чи є у вас список побажань в Амазонії чи деінде? :) Я встановив query_cache_limit на 1024. Зараз немає проблем із блокуванням. Я робив це в змінних спочатку від клієнта mysql. встановити глобальний запит_cache_limit = 1024; Зараз я напишу це на мій.cnf. Це рішення дало мені час планувати міграцію innodb без будь-якого стресу, тож дякую.

Відповіді:


8

MyISAM Storage Engine суто відомий тим, що виконує блокування повних таблиць для будь-яких DML (ВСТАВКИ, ОНОВЛЕННЯ, ВИДАЛЕННЯ). InnoDB напевно вирішить це питання в довгостроковій перспективі.

Я писав про плюси і мінуси використання MyISAM проти InnoDB

Що стосується вашого поточного питання, то тут можливий сценарій:

  • articleі article_commentsє обома таблицями MyISAM
  • article_commentsмає один або декілька індексів, statusяк стовпець
  • Оновлення сторінок індексів для article_commentsкешується в буфері MyISAM Key (розмір key_buffer_size ), в результаті чого старі індексні сторінки виходять із ключа буфера MyISAM
  • У вас є SELECT запити, які виконують JOIN між articleіarticle_comments

У моїй запропонованої сценарії ВИБИРАЄ проти articleтаблиці може бути проведена по порівнянні з , дозволяючи запис з - за того , щоб чекати , article_commentsщоб бути вільними від будь-якого DML (в цьому випадку UPDATE)


Дякуємо за вашу відповідь (та посилання), ваш сценарій справжній. Я не усвідомлював, що більшість вибраних статей дійсно приєднується до таблиці коментарів (або, іншими словами, бачив неповні висловлювання у списку процесів phpmyadmin). Чи знаєте ви короткострокове рішення для запобігання численних запитів очікування? Я вже спробував це з "UPDATE LOW_PRIORITY" у конкретному операторі, але це не внесло помітних змін. Ми справді змінимося до innodb у майбутньому, але мені цікаво, чи є спосіб досягти покращення в даний час.
32bitfloat

Кінцеве рішення: Перетворення таблиць у InnoDB. Дивіться мій пост dba.stackexchange.com/a/9422/877 про те, як перетворити все MyISAM в InnoDB
RolandoMySQLDBA

7

У цей момент вся сторінка стає повільною. Сама база даних зайнята хвилин.

Пахне, як у вас великий Query_cache?

mysql> SHOW VARIABLES LIKE 'query_cache%';
+------------------------------+----------+
| Variable_name                | Value    |
+------------------------------+----------+
| query_cache_limit            | 1048576  |
| query_cache_min_res_unit     | 4096     |
| query_cache_size             | 16777216 | -- Not over 50M
| query_cache_type             | DEMAND   | -- Only if using SQL_CACHE
| query_cache_wlock_invalidate | OFF      |
+------------------------------+----------+

У виробничих системах з великою кількістю записів ви також можете вимкнути кеш запитів.

Всі записи в query_cache для даної таблиці видаляється при будь- записи відбувається в цю таблицю. Чим більше КК, тим повільніше це завдання.

MyISAM використовує блокування "рівень таблиці". Читання та запис не може відбуватися одночасно (за тією ж таблицею). Сирий, але ефективний.


1
Ну так. У нас є близько 64M кеш-пам'яті. Дякуючи за цю інформацію, яка була для мене новою, проте ми мали те саме значення на старому сервері, де ми не помітили настільних блоків. Ми вже почали переходити на InnoDB, але цей факт залишається загадкою ...
32bitfloat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.