Kada dodavanje indeksa usporava stvari
U ovom članku
Tabela dnevnih podataka ima jedan ključ: brojač i datum zajedno. Pet mesta u kodu postavlja joj drugačije pitanje — ne „ovaj brojač kroz vreme“, nego „svi brojači na ove datume“. Galerija na početnoj stranici, top lista, mapa sajta, grafikon za 90 dana i podaci o stanju. Bez indeksa na koloni datuma svaki od njih čita svih 114.113 redova.
Dodavanje tog indeksa ubrzava galeriju deset puta. Nije dodat. Evo merenja koje je to odlučilo.
Jedan upit je postao mnogo brži
Galerija traži brojače koji su danas bili aktivni. Bez indeksa na datumu pregleda celu tabelu; sa njim traži jedan datum i čita 443 reda. 61,5 milisekundi postalo je 6,1. To nije suptilan rezultat, i da je to bilo jedino što je mereno, indeks bi sada bio u bazi.
Dva upita su postala sporija
Mapa sajta traži četrnaest dana i postala je 19% sporija. Podaci o stanju traže godinu dana i postali su 10% sporiji. U oba slučaja planer upita prešao je sa primarnog ključa na novi indeks i napravio lošiji izbor.
Ovo je deo koji vredi razumeti, jer to nije greška planera. Čitanje opsega preko sekundarnog indeksa znači pronaći odgovarajuće redove u indeksu pa svaki posebno dohvatiti iz tabele. Za uzak isečak to je odlična pogodba. Za četrnaest dana od trinaest meseci to je i dalje mnogo redova dohvaćenih jedan po jedan, a običan pregled tabele — čitanje po fizičkom redosledu, što diskovi i keševi vole — to pobeđuje. Planer to ne zna. Vidi opseg i indeks i uzme ga.
Ne postoji način da se kaže „koristi ovaj indeks samo za galeriju“. Indeks je dostupan svakom upitu koji dotiče kolonu, a planer će ga koristiti gde god njegove procene kažu da treba. Dodavanje jednog je izmena svakog upita nad tom tabelom, a ne samo onog kome je bio namenjen.
Zajedno: ništa
Za svih pet, 555 milisekundi postalo je 524. Poboljšanje od 1,1×, što na malom serveru koji ove stranice ionako služi iz keša ne vredi izmene šeme.
Grafikon za 90 dana izgleda kao da je poboljšan za 9%. Nije uračunat, i vredi reći zašto. Svaki upit je meren tri puta: bez indeksa, sa njim, pa opet bez njega. Ako drugo merenje bez indeksa ne pada blizu prvog, razlika je bila u računaru, a ne u izmeni. Za grafikon od 90 dana dva merenja bez indeksa razlikovala su se za 13,8% — više od efekta koji se tvrdi. Zato taj red ne meri ništa i prijavljen je kao ništa.
Kako je mereno i zašto je to važno
Ne na živoj tabeli. Skripta je kopira, radi na kopiji i na kraju je briše. Dodavanje indeksa u produkcijsku tabelu da se vidi šta će se desiti funkcioniše samo jednom po iznenađenju.
Upiti su stvarni, preuzeti iz koda, uključujući spajanje sa tabelom brojača. Raniji oblik ovog testa koristio je pojednostavljenu zamenu i dao mnogo uzbudljiviji odgovor: dvadeset puta brže. Pojednostavljeni upit nije bio nešto što bilo šta zaista izvršava.
Šta bi broj bio
Da je ovo mereno na uobičajen način — uzmeš upit koji deluje spor, izmeriš ga pre i posle — odgovor bi bio „deset puta brže, objavi“. Indeks bi ušao, galerija bi postala brža, mapa sajta i stranica sa stanjem postale bi sporije, i niko ne bi povezao jedno s drugim, jer ih niko nije posmatrao.
To je opšti oblik stvari. Izmena zajedničke infrastrukture ne može se proceniti na slučaju koji ju je podstakao. Pitanje nije „da li ovo pomaže stvari koju gledam“, nego „šta još to dotiče i šta se dešava s tim“.
Postoji verzija koja bi mogla da radi: indeks sa obe kolone, prvo datum, tako da galerija može da se odgovori samo iz indeksa bez vraćanja u tabelu. Moguće je i da planeru ne ponudi iskušenje na širim opsezima. To nije mereno, pa nije preporuka — to je sledeće što treba staviti na kopiju.