Звернутися до підтримки

Відповідаємо електронною поштою, зазвичай протягом двох днів.

Google reCAPTCHA перевіряє це звернення на зловживання; дані передаються до Google. Скрипт завантажується лише тоді, коли ви відкриваєте цю форму.

← Усі записи

Коли індекс робить усе повільнішим

У таблиці з денними цифрами один ключ: лічильник і дата разом. П'ять місць у коді ставлять їй інше питання — не «цей лічильник у часі», а «всі лічильники в ці дні». Галерея на головній, топ-список, карта сайту, графік за 90 днів і цифри стану. Без індексу на стовпці дати кожен із них читає всі 114 113 рядків.

Цей індекс робить галерею вдесятеро швидшою. Його не додали. Ось вимір, який це вирішив.

галерея, один день — з 61,5 до 6,1 мс топ-список, 30 днів — з 88,6 до 89,2 мс карта сайту, 14 днів — з 79,6 до 94,8 мс графік за 90 днів — з 120,0 до 109,2 мс цифри стану, 365 днів — з 204,9 до 225,1 мс верхня смуга без індексу, нижня з ним разом: 555 мс стають 524 мс

Один запит став набагато швидшим

Галерея питає лічильники, що мали сьогодні звернення. Без індексу на даті вона проходить усю таблицю; з індексом знаходить одну дату й читає 443 рядки. З 61,5 мілісекунди вийшло 6,1. Це не тонкий результат, і якби це було єдиним, що виміряли, індекс зараз стояв би в базі.

Два запити стали повільнішими

Карта сайту питає чотирнадцять днів і сповільнилася на 19 %. Цифри стану питають рік і сповільнилися на 10 %. В обох випадках планувальник перейшов із первинного ключа на новий індекс і вибрав гірше.

Ось частина, яку варто зрозуміти, бо це не помилка планувальника. Читати діапазон через вторинний індекс означає: знайти відповідні рядки в індексі й дістати кожен із таблиці. Для вузького шматка це вигідно. Для чотирнадцяти днів із тринадцяти місяців це й далі багато рядків, діставаних поодинці, а прямий прохід по таблиці — читання у фізичному порядку, який люблять диски й кеші — перемагає. Планувальник цього не знає. Він бачить діапазон та індекс і бере його.

Не можна сказати «використовуй цей індекс лише для галереї». Індекс доступний будь-якому запиту, що торкається стовпця, і планувальник візьме його всюди, де його оцінки так підкажуть. Додати індекс — це зміна в усіх запитах до цієї таблиці, а не в тому одному, який мали на думці.

Разом: нічого

За всіма п'ятьма 555 мілісекунд стали 524. Покращення в 1,1 раза, яке на Raspberry Pi, що й так віддає ці сторінки з кешу, не варте зміни схеми.

Графік за 90 днів виглядає покращеним на 9 %. Він не зарахований, і варто сказати чому. Кожен запит вимірювали тричі: без індексу, з індексом, потім знову без. Якщо другий прогін без індексу не лягає поруч із першим, різницю дала машина, а не зміна. У графіка за 90 днів два прогони без індексу розійшлися на 13,8 % — більше, ніж ефект, який стверджувався б. Отже, цей рядок не міряє нічого, і як ніщо він і подається.

Як вимірювали і чому це важливо

Не на робочій таблиці. Скрипт робить копію, працює на копії і наприкінці її видаляє. Додати індекс до бойової таблиці, щоб подивитися, що буде, можна один раз на кожну несподіванку.

Запити справжні, узяті з коду, разом зі з'єднанням із таблицею лічильників. Раніша версія цієї перевірки використовувала спрощену заміну й дала куди надихаючішу відповідь: у двадцять разів швидше. Цього спрощеного запиту ніхто не виконує.

Яке число вийшло б

Якби міряли звичайним способом — узяти запит, що здається повільним, засікти до і після — відповідь була б «удесятеро швидше, ставимо». Індекс би ввійшов, галерея пришвидшилася б, карта сайту й сторінка стану сповільнилися б, і ніхто б не пов'язав одне з одним, бо на ці дві ніхто не дивився.

Така загальна форма справи. Зміну в спільній інфраструктурі не можна оцінювати за випадком, який її спричинив. Питання не «чи допомагає це тому, на що я дивлюся», а «чого ще воно торкається і що з тим стане».

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

Реклама