Връзка с поддръжката

Отговаряме по имейл, обикновено до два дни.

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×, което на малък сървър, обслужващ тези страници така или иначе от кеш, не си струва промяна в схемата.

90-дневната диаграма изглежда подобрена с 9%. Това не се брои и си струва да се каже защо. Всяка заявка беше измерена три пъти: без индекса, с него и после отново без него. Ако второто изпълнение без индекса не попадне близо до първото, разликата се дължи на машината, а не на промяната. При 90-дневната диаграма двете изпълнения без индекса се различаваха с 13,8% — повече от заявения ефект. Така този ред не измерва нищо и се отчита като нищо.

Как беше измерено това и защо е важно

Не върху работещата таблица. Скриптът я копира, работи върху копието и накрая изтрива копието. Добавянето на индекс към производствена таблица, за да се види какво ще стане, работи само веднъж на изненада.

Заявките са истинските, взети от кода, включително съединяването с таблицата с броячи. По-ранна версия на този тест използваше опростен заместител и даде много по-вълнуващ отговор: двадесет пъти по-бързо. Опростената заявка не беше такава, каквато нещо наистина изпълнява.

Какво щеше да бъде числото

Ако това беше измерено по обичайния начин — вземаш заявката, която изглежда бавна, и засичаш времето преди и след — отговорът щеше да бъде „десет пъти по-бързо, пускай“. Индексът щеше да бъде добавен, галерията щеше да се ускори, картата на сайта и статусната страница щяха да се забавят и никой нямаше да свърже двете неща, защото никой не следеше тях.

Това е общата форма. Промяна в споделена инфраструктура не може да бъде оценена по случая, който я е породил. Въпросът не е „помага ли това на нещото, което гледам“, а „какво друго засяга това и какво става с него“.

Има вариант, който може да проработи: индекс с двете колони, с датата на първо място, така че галерията да получава отговор само от индекса, без да се връща към таблицата. Той може и да не изкушава планировчика при по-широките диапазони. Това не е измерено, затова не е препоръка — а следващото нещо, което да се изпробва върху копието.

Реклама