Keď pridanie indexu veci spomalí
V tomto článku
Tabuľka denných údajov má jeden kľúč: počítadlo a dátum spolu. Päť miest v kóde jej kladie inú otázku — nie „toto počítadlo v čase“, ale „všetky počítadlá v týchto dátumoch“. Galéria hlavnej stránky, rebríčky, mapa webu, 90-dňový graf a údaje o stave. Bez indexu na stĺpci dátumu každé z týchto miest číta všetkých 114 113 riadkov.
Pridanie tohto indexu zrýchli galériu desaťkrát. Nebol pridaný. Tu je meranie, ktoré rozhodlo.
Jeden dopyt sa výrazne zrýchlil
Galéria žiada počítadlá, ktoré boli dnes aktívne. Bez indexu dátumu prehľadáva celú tabuľku; s ním vyhľadá jediný dátum a prečíta 443 riadkov. Zo 61,5 milisekundy sa stalo 6,1. To nie je nepatrný výsledok a keby sa meralo iba toto, index by už teraz bol v databáze.
Dva dopyty sa spomalili
Mapa webu žiada štrnásť dní a spomalila sa o 19 %. Údaje o stave žiadajú rok a spomalili sa o 10 %. V oboch prípadoch plánovač dopytov prešiel z primárneho kľúča na nový index a vybral horšie.
Toto sa oplatí pochopiť, pretože to nie je chyba plánovača. Čítanie rozsahu cez sekundárny index znamená nájsť v indexe zodpovedajúce riadky a potom každý načítať z tabuľky. Pri úzkom výseku je to výhodné. Pri štrnástich dňoch z trinástich mesiacov je to stále veľa riadkov načítavaných po jednom a priame prehľadanie tabuľky — čítanie vo fyzickom poradí, ktoré majú disky a vyrovnávacie pamäte rady — ho prekoná. Plánovač to nevie. Vidí rozsah a index a vezme ho.
Nedá sa povedať „použi tento index iba pre galériu“. Index je dostupný každému dopytu, ktorý sa stĺpca dotkne, a plánovač ho použije všade, kde mu to odhady odporučia. Jeho pridanie je zmenou každého dopytu na tejto tabuľke, nie iba toho, pre ktorý bol určený.
Spolu: nič
Pri všetkých piatich sa z 555 milisekúnd stalo 524. Zlepšenie 1,1×, ktoré na malom serveri poskytujúcom tieto stránky aj tak z vyrovnávacej pamäte nestojí za zmenu schémy.
90-dňový graf vyzerá, že sa zlepšil o 9 %. Nepočíta sa to a oplatí sa povedať prečo. Každý dopyt sa meral trikrát: bez indexu, s ním a potom znovu bez neho. Ak sa druhý beh bez indexu nepriblíži prvému, rozdiel spôsobil stroj, nie zmena. Pri 90-dňovom grafe sa oba behy bez indexu líšili o 13,8 % — viac než tvrdený účinok. Tento riadok teda nič nemeria a tak sa aj vykazuje.
Ako sa meralo a prečo na tom záleží
Nie na živej tabuľke. Skript ju skopíruje, pracuje s kópiou a na konci ju odstráni. Pridávať index do produkčnej tabuľky na zistenie výsledku funguje iba raz na každé prekvapenie.
Dopyty sú skutočné, prevzaté z kódu vrátane spojenia s tabuľkou počítadiel. Skoršia verzia tohto testu používala zjednodušenú náhradu a priniesla oveľa vzrušujúcejšiu odpoveď: dvadsaťkrát rýchlejšie. Zjednodušený dopyt v skutočnosti nespúšťala žiadna časť systému.
Aké číslo by vyšlo
Keby sa to meralo bežným spôsobom — vziať dopyt, ktorý pôsobí pomaly, zmerať ho pred zmenou a po nej — odpoveď by bola „desaťkrát rýchlejšie, nasaďme to“. Index by sa pridal, galéria by sa zrýchlila, mapa webu a stavová stránka by sa spomalili a nikto by tieto veci nespojil, pretože ich nikto nesledoval.
Taký je všeobecný tvar problému. Zmenu spoločnej infraštruktúry nemožno hodnotiť podľa prípadu, ktorý ju podnietil. Otázka neznie „pomôže to veci, na ktorú sa pozerám“, ale „čo ďalšie sa toho dotýka a čo sa s tým stane“.
Existuje verzia, ktorá by mohla fungovať: index nesúci oba stĺpce s dátumom na prvom mieste, aby galéria dostala odpoveď iba z indexu bez návratu do tabuľky. Je tiež možné, že pri širších rozsahoch nebude index zvádzať plánovača k svojmu použitiu. To sa nemeralo, takže nejde o odporúčanie — je to ďalšia vec na vyskúšanie na kópii.