Базата данни Mysql се забавя - Администриране на сървъра
Какво да направите и как да решите проблемите с производителността на базата данни на MySQL. В този случай няма да говорим за оптимизиране на сървъра на базата данни, а ще говорим директно за заявки в базата данни.
Така че има следното, mysqltuner ни показва, че всички параметри на базата данни са конфигурирани правилно и ресурсите се използват ефективно. Но все пак има някои замръзвания. Как да намерите проблемни заявки.
Бавен регистър на заявките
Първо, трябва да получим статистика. За да направим това, ние включваме регистър на бавните заявки в базата данни. За да направите това, добавете редовете към файла /etc/my.cnf
- log_slow_queries променлива, която задава пътя към регистрационния файл
- long_query_time е минималното време за изпълнение на заявката, което ще се счита за бавно. Тези. всички заявки, чието време за изпълнение е 2 или повече секунди, ще бъдат регистрирани
Понякога има смисъл да активирате регистриране на заявки, които нямат индекси
След като добавим стойностите към конфигурацията, ще рестартираме базата данни
След това чакаме да се съберат статистическите данни, колкото повече време за събиране на данни, толкова по-подходящи данни ще получим.
Работа с дневника на бавните заявки
Ако вашите заявки се изпълняват интензивно и има доста от тях и са бавни, тогава дневникът може да нарасне до големи размери от няколко десетки гигабайта. Разбира се, практически е невъзможно да се разбере такъв дневник. В този случай дневникът съдържа повтарящи се заявки. За да приведете дневника на бавните заявки в четима форма, е необходимо да го обработите с помощната програма mk-query-digest или pt-query-digest.
За да инсталирате Percona Toolkit, можете да използвате командата
След това започнете да обработвате отчета
В резултат на това получаваме файл с групирани заявки
Този файл съдържа информация за топ 10заявки
Първата таблица показва, че 1,2,3 доклада отнемат най-много време с оглед продължителността и броя на стартиранията.
По-нататък във файла следва информация за всеки номер на заявка от таблицата и името на базата данни, в която е изпълнена заявката.
След това се свържете с базата данни от първата заявка
И ние изпълняваме плана за заявка, предложен в доклада
В резултат на това ще получим план за изпълнение на заявката.
Вашият резултат ще бъде напълно различен, но все още ще има десет реда, ето какво означават те:
- id– номер на заявка (може да са няколко, ако има подзаявки)
- select_typeе тип заявка SELECT.
- SIMPLE- Проста SELECT заявка без подзаявки или UNION
- PRIMARY- SELECT - най-външната заявка в JOIN
- ЗАВИСИМА ПОДЗАЯВКА - подзаявка, която зависи от външна заявка
- DERIVED- SELECT е част от подзаявка във FROM
- SUBQUERYе първият SELECT в подзаявката
- UNCACHABLE SUBQUERY– подзаявката не може да се кешира
- UNION- следващ SELECT в UNION
- ЗАВИСИМ ОБЪЕДИНЕНИЕ- следващият SELECT в UNION зависи от външната заявка
- UNION RESULT- UNION резултат
- Система- таблицата има само един ред
- Const- Таблицата има само един съответстващ ред, който е индексиран. Тип бърза връзка.
- Пълен текст- използва пълния текстов индекс на таблицата
- Eq_ref- всички частииндексите се използват за свързване. Също така бърз тип за връзка.
- Ref- всички съвпадащи редове от индексната колона се четат за всяка комбинация от редове от предходната таблица.
- Ref_or_null- същото като ref, но също така съдържа редове с нулева стойност за колоната
- Index_merge- Съединението използва списък от индекси, за да получи набор от резултати. Ключовата колона на изхода на командата EXPLAIN ще съдържа списък с използвани индекси.
- Unique_subquery- IN подзаявката връща само един резултат от таблицата и използва първичния ключ.
- Index_subquery- същото като Unique_subquery, но връща повече от един резултат.
- Диапазоне индексът, използван за намиране на съвпадащия ред в рамките на определен диапазон, обикновено когато ключовата колона се сравнява с константа с помощта на оператори като: МЕЖДУ, ВЪВ, >, >= и т.н.
- Индекс- Сканира цялото дърво на индекса, за да намери съвпадащи редове.
- Всички– Използва сканиране на цялата таблица, за да намери съвпадащи редове. Това е най-лошата стойност и показва, че нямате индекс.
Тези. за групиране се използва временна таблица, която след това също се сортира и сортирането се извършва без използване на индекси.
Ако GROUP BY присъства в заявка, тогава MySQL винаги ще сортира резултатите. Ако редът на изходните резултати не е важен за вас, тогава е по-добре да се отървете от тази операция (сортиране).
Или създайте същия индекс на полето, по което се извършва сортирането, както и индекси на вторични ключове във всички таблици от заявката (вторичният ключ е полето, което се използва в JOIN).
Като запазите изходните данни на заявките за обяснение, ще получите файл, който трябва да прехвърлите на програмиста, за да може той да преразгледа плановете за изпълнение на тежки заявки, да добави липсващи индекси, евентуално да промени реда на присъединяване, да изключи незадължителни условия и сортиране.
Оптимизация на работата на уебсайта и сървъра, моля свържете се с [имейл защитен]