Kai pridėtas indeksas viską sulėtina
Šiame straipsnyje
Dienos skaičių lentelė turi vieną raktą: skaitiklį ir datą kartu. Penkios kodo vietos užduoda jai kitą klausimą — ne „šis skaitiklis laikui bėgant“, o „visi skaitikliai šiomis datomis“. Pradinio puslapio galerija, reitingai, svetainės schema, 90 dienų diagrama ir būsenos skaičiai. Be datos stulpelio indekso kiekviena jų skaito visas 114 113 eilučių.
Pridėjus tą indeksą, galerija pagreitėja dešimt kartų. Jis nepridėtas. Štai matavimas, nulėmęs sprendimą.
Viena užklausa labai pagreitėjo
Galerija prašo šiandien aktyvių skaitiklių. Be datos indekso ji nuskaito visą lentelę; su juo suranda vieną datą ir perskaito 443 eilutes. 61,5 milisekundės tapo 6,1. Rezultatas akivaizdus, ir jei būtų matuota tik tai, indeksas dabar jau būtų duomenų bazėje.
Dvi užklausos sulėtėjo
Svetainės schema prašo keturiolikos dienų ir sulėtėjo 19 %. Būsenos skaičiai prašo metų ir sulėtėjo 10 %. Abiem atvejais užklausų planuotojas perėjo nuo pirminio rakto prie naujo indekso ir pasirinko blogiau.
Šią dalį verta suprasti, nes tai ne planuotojo klaida. Skaityti intervalą per antrinį indeksą reiškia surasti atitinkančias eilutes indekse ir tada kiekvieną gauti iš lentelės. Siauram pjūviui tai naudinga. Keturiolika dienų iš trylikos mėnesių vis tiek yra daug po vieną gaunamų eilučių, o tiesioginis lentelės nuskaitymas — fizine tvarka, kurią mėgsta diskai ir podėliai, — laimi. Planuotojas to nežino. Jis mato intervalą ir indeksą ir jį pasirenka.
Negalima pasakyti „naudok šį indeksą tik galerijai“. Indeksas prieinamas kiekvienai užklausai, liečiančiai stulpelį, ir planuotojas jį naudos visur, kur, jo vertinimu, turėtų. Pridėti indeksą – pakeisti visas tos lentelės užklausas, o ne vien tą, kuriai jis skirtas.
Kartu – nieko
Per visas penkias 555 milisekundės tapo 524. Pagerėjimas 1,1× – mažame serveryje, kuris šiuos puslapius vis tiek pateikia iš podėlio, dėl to keisti schemos neverta.
Atrodo, kad 90 dienų diagrama pagerėjo 9 %. Tai neįskaičiuojama, ir verta pasakyti kodėl. Kiekviena užklausa matuota tris kartus: be indekso, su juo, tada vėl be jo. Jei antras matavimas be indekso nėra artimas pirmajam, skirtumą lėmė kompiuteris, o ne pakeitimas. 90 dienų diagramos du matavimai be indekso skyrėsi 13,8 % — daugiau nei teigiamas poveikis. Todėl ta eilutė nieko neišmatuoja ir taip pateikiama.
Kaip matuota ir kodėl tai svarbu
Ne veikiančioje lentelėje. Scenarijus ją kopijuoja, dirba su kopija ir pabaigoje ją pašalina. Pridėti indeksą į darbinę lentelę ir žiūrėti, kas nutiks, pavyksta tik kartą kiekvienai staigmenai.
Užklausos tikros, paimtos iš kodo, įskaitant sujungimą su skaitiklių lentele. Ankstesnė šio bandymo versija naudojo supaprastintą pakaitalą ir davė daug įspūdingesnį atsakymą: dvidešimt kartų greičiau. Supaprastintos užklausos iš tiesų niekas nevykdo.
Koks būtų buvęs skaičius
Jei būtų matuota įprastai — paimti lėtai atrodančią užklausą, pamatuoti prieš ir po, — atsakymas būtų „dešimt kartų greičiau, paleidžiam“. Indeksas būtų pridėtas, galerija pagreitėtų, svetainės schema ir būsenos puslapis sulėtėtų, ir niekas jų nesusietų, nes niekas jų nestebėjo.
Toks bendras šio reiškinio principas. Bendros infrastruktūros pakeitimo negalima vertinti tik pagal jį paskatinusį atvejį. Klausimas ne „ar tai padeda tam, į ką žiūriu“, o „kas dar tai liečia ir kas tam nutinka“.
Yra galinti veikti versija: abu stulpelius turintis indeksas su data pirmoje vietoje, kad galerijai būtų galima atsakyti vien iš indekso, negrįžtant į lentelę. Jis taip pat gali nevilioti planuotojo platesniems intervalams. Tai neišmatuota, todėl ne rekomendacija — tai kitas dalykas, kurį verta išbandyti kopijoje.