Când adăugarea unui index încetinește lucrurile
Tabelul cifrelor zilnice are o singură cheie: contorul și data, împreună. Cinci locuri din cod îi pun o altă întrebare — nu „acest contor de-a lungul timpului”, ci „toate contoarele la aceste date”. Galeria de pe pagina principală, clasamentul, sitemap-ul, un grafic pe 90 de zile și cifrele de stare. Fără un index pe coloana datei, fiecare dintre acestea citește toate cele 114.113 rânduri.
Adăugarea acelui index face galeria de zece ori mai rapidă. Nu a fost adăugat. Iată măsurătoarea care a decis.
O interogare a devenit mult mai rapidă
Galeria cere contoarele care au fost active azi. Fără index pe dată, scanează întregul tabel; cu index, caută o singură dată calendaristică și citește 443 de rânduri. 61,5 milisecunde au devenit 6,1. Nu este un rezultat subtil, iar dacă ar fi fost singurul lucru măsurat, indexul s-ar afla acum în baza de date.
Două interogări au devenit mai lente
Sitemap-ul cere paisprezece zile și a devenit cu 19% mai lent. Cifrele de stare cer un an și au devenit cu 10% mai lente. În ambele cazuri, planificatorul de interogări a trecut de la cheia primară la noul index și a făcut o alegere mai proastă.
Aceasta este partea care merită înțeleasă, pentru că nu este o eroare a planificatorului. A citi un interval printr-un index secundar înseamnă a găsi rândurile potrivite în index și apoi a prelua fiecare dintre ele din tabel. Pentru o felie îngustă, asta e un chilipir. Pentru paisprezece zile din treisprezece luni, sunt totuși multe rânduri preluate unul câte unul, iar o scanare directă a tabelului — citit în ordine fizică, ceea ce le place discurilor și cache-urilor — câștigă. Planificatorul nu știe asta. Vede un interval și un index și îl folosește.
Nu există nicio modalitate de a spune „folosește acest index doar pentru galerie”. Un index este disponibil pentru fiecare interogare care atinge coloana, iar planificatorul îl va folosi oriunde estimările lui spun că ar trebui. Adăugarea unui index este o schimbare pentru fiecare interogare asupra acelui tabel, nu doar pentru cea căreia îi era destinat.
Împreună: nimic
Pe toate cele cinci, 555 de milisecunde au devenit 524. O îmbunătățire de 1,1×, care, pe un server mic ce oricum servește aceste pagini dintr-un cache, nu merită o schimbare de schemă.
Graficul pe 90 de zile pare să se fi îmbunătățit cu 9%. Nu este luat în calcul, și merită spus de ce. Fiecare interogare a fost măsurată de trei ori: fără index, cu index, apoi din nou fără. Dacă a doua rulare fără index nu ajunge aproape de prima, diferența a fost dată de mașină, nu de schimbare. Pentru graficul pe 90 de zile, cele două rulări fără index au diferit cu 13,8% — mai mult decât efectul pretins. Așa că acel rând nu măsoară nimic și este raportat ca nimic.
Cum a fost măsurat și de ce contează
Nu pe tabelul real. Scriptul îl copiază, lucrează pe copie și șterge copia la final. Adăugarea unui index pe un tabel de producție pentru a vedea ce se întâmplă funcționează o singură dată per surpriză.
Interogările sunt cele reale, preluate din cod, inclusiv join-ul cu tabelul contoarelor. O versiune anterioară a acestui test folosea un substitut simplificat și a produs un răspuns mult mai spectaculos: de douăzeci de ori mai rapid. Interogarea simplificată nu era una pe care ceva o rulează efectiv.
Care ar fi fost numărul
Dacă măsurarea s-ar fi făcut în modul obișnuit — se ia interogarea care pare lentă și se cronometrează înainte și după — răspunsul ar fi fost „de zece ori mai rapid, gata de livrare”. Indexul ar fi fost adăugat, galeria ar fi devenit mai rapidă, sitemap-ul și pagina de stare ar fi devenit mai lente și nimeni nu ar fi legat cele două lucruri, pentru că nimeni nu se uita la acelea.
Aceasta este forma generală. O schimbare a infrastructurii comune nu poate fi evaluată pe cazul care a motivat-o. Întrebarea nu este „ajută asta lucrul la care mă uit”, ci „ce altceva atinge asta și ce se întâmplă cu acel lucru”.
Există o variantă care ar putea funcționa: un index care conține ambele coloane, cu data pe primul loc, astfel încât galeria să poată primi răspuns doar din index, fără a se întoarce la tabel. S-ar putea să evite și ispitirea planificatorului pe intervalele mai largi. Asta nu a fost măsurat, deci nu este o recomandare — este următorul lucru de pus pe copie.