WordPress ja tietokannan indeksit kokonaisuutena
Tietokannan indeksit kuuluvat niihin optimointeihin, joita ehdotetaan usein ensimmäisenä – ja ymmärretään harvoin kunnolla. WordPress-ympäristössä indeksit voivat olla joko ratkaiseva suorituskykyparannus tai täysin turha, jopa haitallinen lisä. Ero näiden välillä ei riipu MySQL:n versiosta tai palvelimen tehosta, vaan siitä millaisia kyselyitä WordPress oikeasti ajaa ja millaisessa kuormassa.
Indeksi ei ole taikatemppu. Se on kompromissi: nopeammat haut hinnalla, joka maksetaan kirjoitusoperaatioissa, muistissa ja ylläpidossa. Tässä artikkelissa pureudutaan siihen, milloin tietokannan indeksit auttavat WordPressissä, milloin ne eivät auta lainkaan ja milloin ne tekevät tilanteesta huonomman.
Mitä tietokantaindeksi oikeasti tekee
Indeksi on hakurakenne, ei optimointiasetus
Indeksi on erillinen tietorakenne, jonka avulla tietokanta löytää rivit nopeammin ilman koko taulun läpikäyntiä. Ilman indeksiä kysely tekee full table scanin. Indeksin kanssa tietokanta voi hypätä suoraan relevantteihin riveihin.
Tämä kuulostaa aina hyvältä – mutta vain, jos:
-
kysely käyttää indeksoitua saraketta
-
indeksi vastaa kyselyn rakennetta
-
dataa on riittävästi, jotta hyöty ylittää kustannuksen
Pienessä WordPress-sivustossa nämä ehdot eivät usein täyty.
Indeksit eivät nopeuta kaikkea
Indeksit auttavat erityisesti:
-
WHERE-ehtoja
-
JOIN-operaatioita
-
ORDER BY -lajittelua
-
GROUP BY -ryhmittelyä
Ne eivät auta:
-
kyselyitä, jotka palauttavat lähes kaikki rivit
-
kirjoitusoperaatioita
-
huonosti rakennettuja kyselyitä
-
tilanteita, joissa välimuisti osuu lähes aina
Jos WordPress palvelee sivut page cachesta, tietokantaindeksit eivät ole pullonkaula.
WordPressin tietokantarakenne ja indeksit
Ydinindeksit ovat jo olemassa
WordPressin core-taulut eivät ole indeksoimattomia. Esimerkiksi:
-
wp_posts
-
wp_postmeta
-
wp_users
-
wp_usermeta
sisältävät jo joukon indeksejä, jotka kattavat yleisimmät käyttötapaukset. Näitä indeksejä on hiottu vuosien aikana todellista käyttöä vasten.
Ajatus “WordPressin tietokanta on huonosti indeksoitu” on useimmiten väärä.
wp_postmeta on poikkeus – ja syystä
wp_postmeta on yksi WordPressin suurimmista suorituskykiongelmien lähteistä. Se on geneerinen key–value-taulu, jota käytetään kaikkeen.
Moni ehdottaa lisäindeksejä wp_postmetaan. Tämä voi auttaa, mutta vain tietyissä tilanteissa:
-
kun meta_key on vakio
-
kun kyselyt toistuvat usein
-
kun dataa on paljon
Yleinen, laajasti indeksoitu wp_postmeta hidastaa kirjoituksia ja kasvattaa indeksien kokoa merkittävästi.
Milloin indeksit oikeasti auttavat WordPressissä
Suuri tietomäärä ilman tehokasta välimuistia
Jos WordPress-sivustolla on:
-
satojatuhansia tai miljoonia postauksia
-
paljon meta-kyselyitä
-
vähän page cache -osumia
indeksit voivat olla merkittävä parannus. Tässä tilanteessa tietokanta tekee oikeasti työtä jokaisella pyynnöllä.
WooCommerce ja transaktionaalinen data
WooCommerce käyttää WordPressin tietokantaa tavalla, joka poikkeaa perinteisestä blogista. Tilaukset, tuotteet, variaatiot ja raportit kuormittavat tietokantaa raskaasti.
Tietyt kohdennetut indeksit voivat:
-
nopeuttaa tilaushakuja
-
parantaa raportointia
-
vähentää admin-näkymien hitautta
Tämä ei kuitenkaan ole “lisää indeksi kaikkeen” -tilanne, vaan tarkasti mitattu optimointi.
Raportointi ja erikoiskyselyt
Jos WordPressiä käytetään datalähteenä:
-
raporteille
-
integraatioille
-
API-kyselyille
indeksit voivat olla välttämättömiä. Nämä kyselyt poikkeavat usein core-logiikasta ja eivät aina hyödynnä olemassa olevia indeksejä.
Milloin indeksit eivät auta lainkaan
Page cache ja CDN edessä
Jos 90–99 % liikenteestä osuu:
-
CDN:ään
-
reverse proxyyn
-
page cacheen
tietokanta ei ole pullonkaula. Indeksien lisääminen ei näy käyttäjälle millään tavalla.
Tässä tilanteessa indeksit ovat “teoreettinen optimointi”.
Hidas PHP tai huono teema
Jos WordPress on hidas, koska:
-
PHP-FPM on alikonfiguroitu
-
teema tekee liikaa työtä
-
lisäosa ajaa raskasta logiikkaa
tietokantaindeksit eivät korjaa ongelmaa. Ne voivat jopa peittää sen hetkellisesti ja vaikeuttaa todellisen syyn löytämistä.
Väärä indeksi väärään kyselyyn
Indeksi, jota kysely ei käytä, on täysin hyödytön. Yleinen virhe on lisätä indeksi sarakkeeseen, jota käytetään vain osana monimutkaista ehtoa tai funktiokutsua.
Tietokanta ei “yritä kovempaa”. Jos indeksi ei sovi kyselyyn, sitä ei käytetä.
Indeksien hinta WordPressissä
Kirjoitusoperaatiot hidastuvat
Jokainen indeksi täytyy päivittää, kun data muuttuu. WordPressissä tämä tarkoittaa:
-
postauksen tallennusta
-
metadatan päivitystä
-
tilausten luontia
Liiallinen indeksointi voi hidastaa adminia ja taustaprosesseja merkittävästi.
Muisti ja levy
Indeksit vievät muistia ja levytilaa. Suurissa wp_postmeta-tauluissa indeksit voivat kasvaa gigatavujen kokoisiksi.
Tämä vaikuttaa:
-
buffer pooliin
-
cache hit rateen
-
koko tietokannan suorituskykyyn
Ylläpito ja migraatiot
Custom-indeksit eivät ole osa WordPress-corea. Ne:
-
voivat kadota migraatioissa
-
vaativat dokumentointia
-
voivat rikkoa yhteensopivuuden hallittujen hostien kanssa
Indeksi on tekninen velka, ellei sitä hallita.
Oikea tapa lähestyä indeksien lisäämistä
Mittaa ennen kuin kosket
Indeksejä ei lisätä “varmuuden vuoksi”. Ensin mitataan:
-
hitaat kyselyt
-
niiden toistuvuus
-
vaikutus kokonaisvasteaikaan
Ilman tätä dataa indeksin lisääminen on arvailua.
Optimoi kysely ennen indeksiä
Usein parempi ratkaisu on:
-
muuttaa kyselyä
-
vähentää meta-kyselyitä
-
käyttää object cachea
Hyvä kysely ilman indeksiä on usein parempi kuin huono kysely indeksin kanssa.
Kohdenna, älä yleistää
Yksi tarkasti valittu indeksi, joka osuu kriittiseen kyselyyn, voi tuoda enemmän hyötyä kuin kymmenen geneeristä indeksiä.
WordPressissä tarkkuus voittaa määrän.
Indeksit ja object cache
Object cache muuttaa koko pelikentän. Kun kyselyiden tulokset ovat muistissa, tietokantaan ei kosketa lainkaan.
Tässä tilanteessa:
-
indeksien merkitys pienenee
-
kirjoitusoperaatioiden hinta korostuu
-
yksinkertaisempi tietokanta on usein parempi
Indeksit ja object cache eivät ole vastakohtia, mutta ne ratkaisevat eri ongelmia.
Yleisimmät virheet
Yleisin virhe on lisätä indeksejä wp_postmetaan ilman ymmärrystä siitä, mitä kyselyitä oikeasti ajetaan. Toinen virhe on kopioida “suositeltuja indeksejä” toisesta projektista.
Kolmas virhe on olettaa, että indeksit ovat aina turvallisia. Ne eivät ole.
Milloin indeksit ovat onnistunut ratkaisu
Indeksit ovat onnistunut ratkaisu, kun:
-
ne kohdistuvat mitattuun ongelmaan
-
ne parantavat tiettyä kriittistä polkua
-
niiden vaikutus on todennettavissa
-
niiden kustannus on hyväksytty
Jos et pysty vastaamaan kysymykseen “mitä tämä indeksi nopeuttaa”, sitä ei pitäisi olla olemassa.
Lopuksi: indeksit ovat kirurginen työkalu
WordPressin tietokannan indeksit eivät ole yleislääke. Ne ovat kirurginen työkalu, jota käytetään tarkasti rajattuun ongelmaan.
Oikeassa paikassa indeksi voi pelastaa koko järjestelmän. Väärässä paikassa se tekee WordPressistä raskaamman, monimutkaisemman ja vaikeammin ylläpidettävän.
Hyvä WordPress-arkkitehtuuri ei nojaa indekseihin oletuksena. Se käyttää niitä harkiten – silloin kun niille on todellinen, mitattu tarve.
