Корисні прийоми для пошуку та виправлення повільних запитів до бази даних WordPress
Помірні запити SQL можуть перешкодити роботі сайту розробки програм WordPress. Час від часу помірні запити є наслідком неадекватно структурованого SQL, який ніколи не слід було робити таким чином.
Більше того, у деяких випадках помірні запити насправді були швидкими запитаннями в певний момент, але в міру того, як сайт ставав більш досвідченим, запит ставав все повільнішим і повільнішим, не маючи змоги бути в курсі розширення бази даних.
Незважаючи на те, що SQL став поміркованим, слід дослідити кілька підходів, щоб виявити та вирішити проблеми з розробкою додатків WordPress. Тут і там комусь може знадобитися певний веб-додаток і він може не мати достатньо енергії, здібностей або плану витрат для вдосконалення на замовлення. Створення без будь-якої підготовки може бути відповіддю на деякі проблеми, але це може зайняти більше часу, ніж починати з поточної бази коду. Спочатку WordPress був структурований як етап ведення блогів, і він продовжує залишатися видатним у цьому. Як би там не було, вона просунулася до повноцінної системи керування вмістом (CMS) і, для деяких цілей, може навіть створити потужну веб-програму – швидко та з істотно меншими витратами, ніж удосконалення на замовлення. Хоча WordPress пропонує вбудовані програми для розробки, його можна використовувати для веб-додатків, щоб зробити його надзвичайно корисним. Внутрішні структури сторінок і дописів можна використовувати для багатьох речей, але якщо вам знадобляться власна інформація та поля, які потрібно включити, шукати чи запитувати, контролювати та показувати, потрібна додаткова робота.
Пошук повільних запитів
Виявлення походження помірних запитань включає два етапи:
- З’ясувати, які питання дійсно є помірними.
- Ідентифікація програми, яка ними керує.
Слід поглянути на два модулі та один SaaS, які можуть дозволити їм виявити помірні запити.
Монітор запитів
Щоб отримати інформацію про сторінку, яка зараз працює, можна використовувати цей модуль. Незважаючи на цілий кластер даних про внутрішню діяльність WordPress, він дає точкову розбивку:
- Скільки питань виникло на цю вимогу?
- Який запит на сторінці зайняв найбільше часу?
- Які можливості вклали найбільше енергії в питання SQL?
- Незалежно від того, чи надходили ці запити з модулів, предметів чи центру WordPress
Екран запиту навіть розпізнає помірні питання з червоним вмістом, що викликає нерви, що спрощує вибір SQL проблеми.
Панель налагодження
Іншим феноменальним інструментом для пошуку холодно помірного SQL є старий, надійний модуль Debug Bar. Панель налагодження надає дані про внутрішнє функціонування WordPress, коли сторінка завантажується такими речами, як:
- Параметри WP_Query
- Дані запиту (враховуючи координацію правил оновлення)
- SQL-запити, створені поточною сторінкою
Щоб увімкнути SQL-перегляд на панелі налагодження, користувач повинен дозволити SAVEQUERIES десь на сайті, ймовірно, у wp-config.php.
Застереження: SAVEQUERIES впливає на виконання на сайті, і, ймовірно, його не слід використовувати на сервері генерації. Однак його можна використовувати на машині для вдосконалення.
Знайти помірний SQL не дуже просто за допомогою панелі налагодження. Наприклад, він не надає таблиць, які можна сортувати, або функції помірних запитів для користувача. Панель налагодження надає можливість стеження, яке спрямовує користувача точно в напрямку джерела питання.
Це виклад завантажених документів і можливостей, які випливають із запиту, який виконується. Частіше, ніж ні, хтось зацікавлений у розділі про абсолютне продовження у підсумку; це місце, де було виконано помірковане питання і звідки слід починати своє полювання. Зручність налаштування кожної ємності, яка спонукає до цього питання, полягає в тому, що це може виявити розуміння того, чому в будь-якому випадку було виконано SQL.
NewRelic
NewRelic — це адміністрація, яка вимірює та перевіряє виконання розробки веб-додатків, включаючи розробку додатків WordPress. Адміністрація надає метричну тонну даних про виконання сайту. Це що завгодно, але не важко втратити будь-яке відчуття напрямку в інформації, яку NewRelic щохвилини надає користувачеві для запитів SQL.
Між NewRelic і модулями, про які ми згадували раніше, є два варті уваги контрасти:
- NewRelic дає набагато більше уявлень про виконання PHP, аж до точного розрахунку часу, витраченого на кожну функцію
- NewRelic відстежує кожну вимогу до сайту поза полем зору, тому можна звернутися до нього пізніше, щоб виявити помірний SQL. Модулі просто дають йому поточну сторінку.
Важливо, що NewRelic має безкоштовний рівень упорядкування, який надає загальні дані про виконання сайту, однак доведеться перейти до платного устрою для фантастичних шансів і кінців для перевірки окремих вимог і пошуку помірних запитів.
Розуміння повільного запиту за допомогою EXPLAIN
До цього моменту пристрої були захищені для пошуку помірних питань. Зараз має бути відомо, чому ці запити заважають справі.
Ключове слово MySQL EXPLAIN може дозволити, е-е, прояснити, що відбувається. Додавання EXPLAIN на початку запиту вказує, як MySQL виконує запитання. Для заплутаних запитів EXPLAIN може допомогти розрізнити помірні фокуси в SQL, наприклад, помірні підзапити або марнотратну діяльність.
Виправлення повільних запитів
Оскільки зрозуміло, що запити є помірними, а EXPLAIN пояснив користувачеві, чому це так, слід розглянути кілька варіантів для вирішення цих сонливих проблем.
Варіант 1: Перекручування питання
Може виникнути питання про те, що екран редагування публікації дуже повільно працює. Запит був частиною метаблоку Custom Fields.
Певна частина SQL приносить список meta_keys з таблиці ks29so_postmeta, який, імовірно, не починається зі знака підкреслення. Пояснення GROUP BY означає, що кожен результат є особливим.
Проводячи цей запит кілька разів, ось скільки часу це може зайняти:
1,7145 сек
1,7911 сек
1,8076 сек
1,7707 сек
1,8456 сек
Можна створити запит, результатом якого будуть подібні результати. Його потрібно вибрати як єдиний у своєму роді meta_keys. Винятковий — це еквівалентне слово для певного, яке просто є поясненням SQL!
Варіант 2: додавання індексу
Поки користувач запускає SQL-запитання у встановленій таблиці MySQL, йому потрібно перевірити всю таблицю, щоб зрозуміти, які рядки важливі для конкретного запиту. У момент, коли стіл стає величезним, перевірка починає займати досить багато часу.
Це те місце, де з’являються записи MySQL. Списки беруть інформацію в таблиці та впорядковують її таким чином, що робить пошук інформації набагато менш вимогливим. Сортуючи інформацію певним чином, файли допомагають зменшити міру фільтрації, яку MySQL виконує для кожного запиту.
Файли можна додавати в окремі сегменти або в різні розділи.
З файлом meta_key найперший час запитання SQL дещо нагадує це:
0,0041 сек
0,0023 сек
0,0030 сек
0,0025 сек
0,0019 сек
Це надзвичайно розумно.
Вираз попередження щодо файлів: кожного разу, коли INSERT створює стовпець або UPDATE використовується для таблиці af, список визначається повторно, що може бути дорогою діяльністю. Записи пришвидшують перегляд із таблиці, але запис у неї відбувається повільніше. Хоча правильно розміщений список індексів може працювати надзвичайно добре, не слід захоплюватися ним, не перевіривши загальний вплив списку на базу даних.
Варіант 3: кешування результатів запиту
Як тільки зрозуміли, що є помірковане питання. Замість того, щоб змінити запитання, може виникнути сценарій, за якого воно просто усуне наслідки запиту. Таким чином можна було б обмежити регулярність виконання запиту, і він отримував би «безкоштовний пропуск» частіше, ніж ні.
WordPress Transients API є одним із способів резервування запитів. Перехідні процеси використовуються для усунення наслідків дорогих завдань, наприклад,
- Запити до зовнішніх сайтів (наприклад, отримання поточних дописів у Facebook)
- Повільні уривки обробки (наприклад, пошук величезних струн із звичною артикуляцією)
- Повільні запити до бази даних!
Вибір підходу
Існує ряд альтернатив, які були викладені, і, швидше за все, існує сімнадцять різних підходів до розуміння цього поміркованого запиту. Який підхід слід застосувати?
Вибір 1 (зміна питання) дав блискучі результати. Однак слід враховувати можливість того, що модифікований запит зазвичай не має подібних результатів. Можна було б мимоволі забити код дещо незрозумілим запитанням.
Альтернатива 2 (включно із записом) не є постійно можливою залежно від таблиці та розділів, які використовуються в запиті. З огляду на таблиці центру розробки додатків WordPress, потрібно було б наголосити на інших ефектах записів:
- Чи передбачає процедура оновлення центру додаткові списки?
- Чи буде включення файлу модерувати різні запити, подібні до INSERT і UPDATE?
Альтернатива 3 (резервування результатів за допомогою бездомних) має незначний ефект — користувачеві не потрібно змінювати перший запит і немає необхідності коригувати структуру бази даних.
Зазвичай люди вибирають варіант 3. У конкретному випадку він може вибрати інший варіант, спираючись на питання, яке він вирішує, або на конкретному сайті, що має проблеми з SQL. Безумовно, не існує універсальної відповіді на більшість проблем із виконанням, тому можна не погоджуватися з рішенням іншого — або спробуйте кожну з трьох без жодної затримки!
Будьте в курсі
Тут окреслено справжню проблему. Поле Custom Fields на CSS-Tricks справді порушувало деякі надзвичайно помірні запити до бази даних. Він також накреслив різні шляхи до потенційних домовленостей.
Вигадування абсолютно нових ідей
Існують різні методології, які можна застосувати, щоб спробувати та прискорити виконання запитань, які включають більше роботи, ніж просто налаштування запиту чи включення списку. Однією з найповільніших частин питання є робота, виконана для об’єднання таблиць для переходу від ідентифікатора клієнта до ідентифікатора елемента, і це потрібно робити для кожного клієнта.
Можна було б денормалізувати інформацію, створивши таблицю, яка зберігає інформацію про дозвіл, поряд з ідентифікатором клієнта та ідентифікатором елемента для всіх ліцензій і просто запитом щодо цього для конкретного клієнта. Потрібно було б змінити таблицю за допомогою тригерів MySQL на INSERT/UPDATE/DELETE до таблиці ліцензій (або інших, покладаючись на те, як інформація може змінитися), однак це значно покращило б виконання опитування цієї інформації.
Таким чином, якщо різні з’єднання модерують питання в MySQL, можливо, буде швидше розбити запит на принаймні два артикуляції та виконати їх незалежно в PHP, а потім зібрати та скерувати результати в коді.