13 tietokantavinkkiä WordPressille

Jos pitäisi nimetä kaksi yleisintä ongelmaa WordPress-sivustoilla, vastauksemme olisi tietoturva ja nopeus. Pääasiallisesti näitä ongelmia yhdistää yksi tekijä: tietokanta.

WordPress-sivuston tietokanta sisältää kaiken tärkeän datan ja toimii usein pullonkaulana sivuston suorituskyvylle, joten voimme huoleti todeta, että tietokanta on WordPress-infrastruktuurin tärkein yksittäinen osa.

Tietokanta on WordPress-infrastruktuurin tärkein yksittäinen osa.

Tässä blogiartikkelissa listaamme 13 vinkkiä, joiden avulla voi varmistaa, että WordPress-sivuston tietokanta toimii mahdollisimman tehokkaasti ja turvallisesti.

WordPress ja tietokantavinkit

Vinkki #1 – hyödynnä tietokantaotoksia

Koska tietokanta on WordPress-infrastruktuurin tärkein yksittäinen osa, siitä tulisi luonnollisesti sisällyttää otos (ns. dumppi) sivuston varmuuskopioihin. On kuitenkin valitettavan yleistä, että sivustoja varmuuskopioidaan vain tallentamalla kopiot WordPressin tiedostoista.

Tietokantaotokset ovat tekstimuotoisia, mikä helpottaa niiden tarkastelua ja tarvittaessa myös muokkaamista. Ne ovat myös yhteensopivia MySQL- ja MariaDB-palvelimien kanssa, mikä mahdollistaa otostiedoston lataamiselle mille tahansa MySQL- tai MariaDB-tietokantapalvelimelle.

Tietokantaotoksen luominen komentoriviltä käsin on helppoa komentojen mysqldump ja wp db export avulla. Seravo hoitaa automaattisesti asiakkaidensa puolesta varmuuskopiot siten, että WordPressin tiedostojen lisäksi niihin sisältyy myös otos tietokannasta. Meidän työkalujemme ja komentojemme avulla voi myös itse luoda uuden varmuuskopion milloin tahansa.

Vinkki #2 – opettele käyttämään WP-CLI:n tietokantakomentoja

WP-CLI:n käytön opetteleminen on hyväksi jokaiselle kehittäjälle ja WordPressin käyttäjälle, mutta tietokantoihin liittyvien komentojen opetteleminen on erityisen hyödyllistä, sillä ne tapaavat olla käytössä olevista työkaluista tehokkaimpia.

Kaikki WP-CLI:n tietokantakomennot voi listata näkyviin käyttämällä komentoa wp db --help.

Oma suosikkini kaikista WP-CLI:n tietokantakomennoista on wp search-replace --all-tables, joka tarjoaa muun muassa helpon tavan muuttaa kaikki http:tä URL-osoitteessaan käyttävä sisältö https-muotoon. Siirtyminen osoitteesta http://esimerkki.fi osoitteeseen https://esimerkki.fi ei ole koskaan ollut helpompaa.

Kaikille Seravon ylläpidossa oleville sivustoille asennetaan automaattisesti ilmainen SSL-varmenne. Komennolla wp search-replace voi varmistaa, ettei sivustolla esiinny mixed content -varoituksia sen jälkeen, kun sivusto on siirretty Seravon palvelimille.

Vinkki #3 – käytä Admineria tietokannan selaamiseen

Adminer on kevyempi ja turvallisempi vaihtoehto PHPMyAdminille. Se koostuu yhdestä PHP-tiedostosta ja tarjoaa graafisen käyttöliittymän tietokannan hallinnoimiseen. Kaikki WordPress-sivustomme toimitetaan valmiiksi asennetun Adminerin kera. Sen avulla asiakkaamme voivat hallita tietokantojaan tehokkaasti ja turvallisesti.

Vinkki #4 – wp_options & autoload

WordPress-sivua ladattaessa suoritetaan aina seuraava kysely:

SELECT * FROM wp_options WHERE autoload = 'yes'

Jos wp_options-taulu on kooltaan suurempi kuin 1MB, tämä kysely johtaa melko raskaaseen tietokantakäyttöön. Siinä tapauksessa wp_options-taulua tulisi yrittää siivota.

Seuraava kysely hakee taulusta rivit, joiden option_value-kentässä on eniten dataa:

SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC LIMIT 30

Jos jokin lisäosa saastuttaa taulua tarpeettoman suurilla riveillä, suosittelemme lähettämään bugi-ilmoituksen lisäosan kehittäjälle.

Jos wp_options-taulun siivoaminen ei onnistu, tulisi autoload-kenttään lisätä indeksi:

CREATE INDEX autoloadindex ON wp_options(autoload, option_name)

Indeksin lisäämisessä pieneen wp_options-tauluun ei tosin ole järkeä, sillä silloin indeksistä saattaa tulla joko yhtä suuri tai suurempi kuin taulu itse. Indeksointia tulisi käyttää käyttää vain, jos wp_options-taulu on kooltaan suurempi kuin 1MB eikä sen siivoaminen ole mahdollista.

Vinkki #5 – wp_postmeta-taulun paisuminen

Räätälöityjä sisältötyyppejä tai WooCommercea käyttävien WordPress-sivustojen wp_postmeta-taulut tapaavat paisua suuriksi. Jokainen uusi sisältöartikkeli lisää vain yhden uuden rivin pitäen sarakkeiden määrän vakiona, mutta add_post_meta()-kutsujen käyttäminen paisuttaa tietokantaa kymmenillä tai sadoilla riveillä artikkelia kohden, ja jokainen näistä riveistä sisältää vain nimi- ja arvosarakkeen.

Tällainen paisuminen voi helposti kasvattaa tietokannan koon valtaviin mittasuhteisiin, joten on tärkeää tunnistaa meta_key-nimimallit, joissa on eniten rivejä. Nämä mallit löytyvät seuraavalla kyselyllä:

SELECT substring(meta_key, 1, 20) AS key_start, count(*) AS count FROM wp_postmeta GROUP BY key_start ORDER BY count DESC LIMIT 30

Vinkki #6 – opettele käyttämään SQL:ää

Tietokannat pohjautuvat yli kahden vuosikymmenen pituiseen insinöörityöhön, jonka tavoitteena on ollut noutaa pieni määrä dataa niin suuresta datajoukosta kuin mahdollista. Siksi ei kannata yrittää keksiä pyörää uudelleen PHP:n avulla, vaan opetella sen sijaan käyttämään SQL:ää.

WordPressiä käyttäessä kannattaa pitää huolta siitä, ettei talleta kaikkea wp_postmetaan. On täysin OK ja jopa suositeltavaa luoda mukautettuja tauluja, joihin on määritelty oikeat sarakkeet, relaatiot ja indeksit.

Kannattaa tutustua tarkemmin indeksointiin ja siihen, miksi kokonaisten taulujen skannaaminen tietokannassa ei ole toivottavaa.

Vinkki #7 – älä kuitenkaan käytä SQL:ää suoraan

WordPressissä ei kannata käyttää suoraan raakaa SQL:ää. Sen sijaan PHP:n get_posts()-metodi soveltuu vallan hyvin perusasioihin ja WP_Query -luokka edistyneempiin käyttötapauksiin.

Jos WP_Query ei ole sopiva haluttuun käyttötarkoitukseen, suosittelemme käyttämään tietokantoja varten suunniteltuja $wpdb-funktioita, kuten $wpdp->get_row() ja $wpdb->insert().

Jos kuitenkin ilmenee tarve käyttää raakaa SQL:ää, ei ole suositeltavaa avata tietokantaa suoraan, vaan käyttää sen sijaan $wpdb->prepare()– ja $wpdb->query()-funktioita SQL-injektioista johtuvien haavoittuvuuksien välttämiseksi.

Vinkki #8 – tietokantapalvelimen määrittäminen

Tietokantapalvelin tulee konfiguroida oikein optimaalisen suorituskyvyn ja turvallisuuden saavuttamiseksi.

MariaDB on Oraclen MySQL:ää parempi vaihtoehto. Siitä tulisi aina käyttää mahdollisimman tuoretta versiota (10.1+). Tietokantamoottoriksi kannattaa valita MyISAM:in sijasta InnoDB ja asettaa merkistöksi UTFMB4 (joka mahdollistaa emojien käytön 😉). Kollaation eli lajittelujärjestyksen suhteen kannattaa varmistaa, että käytössä on asetus, jolla aakkoset toimivat A:sta aina Ö:hön asti.

Sitten onkin vuorossa enää kaikkien muiden asetusten optimointi…

Tietokannan optimaalinen säätäminen ei ole kovin yksinkertaista, varsinkin kun on mentävä edellä mainittuja perusasioita syvemmälle. Jos ei halua itse hoitaa koko määritystyömaata, mutta tavoitteena on kuitenkin saavuttaa parhaan mahdollisen suorituskyvyn ja turvallisuuden, on suositeltavaa joko palkata tietokannalle järjestelmänvalvoja, tai valita avuksi hallinnoinnista huolehtiva WordPress-ylläpitäjä kuten Seravo.

Jos haluaa WordPress-sivustonsa toimivan optimaalisella ohjelmisto- ja laitteistoalustalla, suosittelemme tutustumaan korkealuokkaisiin hosting- ja ylläpitopaketteihimme WordPressille.

Vinkki #9 – transientit ja objektivälimuisti

Redis-välimuistia tai jotain vastaavaa työkalua voi käyttää transienttien ja istuntojen tallentamiseen, jolloin ne voidaan poistaa wp_optionsista. Redis ja WP Transients API helpottavat tietokannan kuormitusta ja auttavat sivuston nopeuttamisessa.

Yksinkertainen WP Transients API -esimerkki

Vinkki #10 – monitoroi suorituskykyä

Sivuston suorituskyvyn monitorointi on olennaisen tärkeää optimaalisen suorituskyvyn ja tyytyväisen kävijäkunnan takaamiseksi. Seravolla asiakkaiden sivustoja tarkkaillaan kellon ympäri, joten huomaamme nopeasti pullonkaulat ylläpidossamme olevien sivustojen suorituskyvyssä ja ilmoitamme niistä asiakkaillemme. Ei ole kuitenkaan koskaan pahitteeksi osata monitoroida verkkosivujen ja tietokannan suorituskykyä itse.

Suoraan tietokannan puolella on ainakin kaksi erittäin hyödyllistä keinoa pysyä perillä kannan ja sen kyselyiden tehokkuudesta. SHOW PROCESSLIST antaa yleiskatsauksen kaikista käynnissä olevista prosesseista ja säikeistä. Saadakseen käsityksen kaikista epätavallisen hitaista kyselyistä tulee aktivoida hitaiden kyselyjen loki, joka näyttää kaikki kyselyt, joiden suoritusaika ylittää asetetun long_query_time-arvon. Vakiona long_query_time on asetettu 10 sekuntiin.

Tuotannossa olevan sivuston suorituskyvyn pullonkaulojen tunnistamiseksi on suositeltavaa ottaa Tideways avuksi PHP:n virheiden ja hitausongelmien vianjäljityksessä. Olemme kirjoittaneet Tidewaysistä ja sen käyttämisestä hieman syvällisemmän katsauksen ja tapaustutkimuksen, joka on erityisen hyödyllinen asiakkaillemme, sillä Seravon WordPress-palvelupaketteihin kuuluu valmis Tideways-integraatio.

Vinkki #11 – tietokannan siivoaminen

Tarpeettomien jäänteiden – kuten vanhojen artikkeliversioiden ja transienttien – siivoaminen tietokannasta on hyvä tapa lisätä kannan suorituskykyä ja turvallisuutta. Tässä esimerkki siitä, kuinka tietokannasta siivotaan transientit ja artikkeliversiot menneeltä vuodelta ja sitä edeltävältä ajalta:

DELETE FROM `wp_posts` WHERE post_type = 'revision' AND post_date NOT LIKE '2019-%'
DELETE FROM wp_options WHERE option_name LIKE ('_transient_%') OR option_name LIKE ('_site_transient_%');

Poistettavien lisäosien datan siivoaminen tietokannasta onnistuu vilkaisemalla plugins-kansiota (wp-content/plugins/lisäosan-nimi) ja tarkastamalla, mitä uninstall.php-tiedosto sisältää. Tällä kikalla voi myös siistiä pois yhä aktiivisessa käytössä olevien lisäosien tarpeetonta dataa: paikantamalla lisäosan poistamisen yhteydessä hävitettävän datan voi pyyhkiä manuaalisesti pois osan vanhemmasta datasta.

Vinkki #12 – ole hyvä ja selitä

Joskus on saatava hieman lisätietoa siitä, kuinka optimoija suorittaa tietokantakyselyn. Silloin voi käyttää EXPLAIN-komentoa, joka saa optimoijan näyttämään tarkalleen, kuinka se ajaa annetun kyselyn.

EXPLAIN SELECT * FROM wp_options WHERE autoload = 'yes'

Vinkki #13 – testaa keinodatalla

Uutta sivustoa kehittäessä on aina hyödyllistä täyttää sivusto keinotekoisella sisällöllä, sillä siitä näkee, miltä lopputulos näyttää ja miten se toimii tuotannossa. Keinotekoisen sisällön lisäämiseen sivustolle on kolme tyyliltään ja vaikeustasoltaan erilaista tapaa. Halutusta lopputuloksesta riippuen yksi tai useampi näistä tavoista voi tulla tarpeeseen.

Helpoin tapa on tuoda sivustolle themeunittestdata.wordpress.xml-tiedosto, jonka WordPress-tiimi on luonut teemojen kehittäjien avuksi. Tiedosto ja tarkemmat ohjeet sen käytöstä löytyvät WordPress Codexista, mutta yksinkertaisesti ilmaistuna tiedosto ladataan GitHubista ja tuodaan sivustolle käyttämällä WordPressin osuvasti nimettyyn ’Työkalut’-valikkoon kuuluvaa ’Tuo’-työkalua.

Suurempaa datamäärää tarvittaessa parhaaksi vaihtoehdoksi muodostuu käyttää WP-CLI-komentorivityökalua ja komentoa wp post generate. Kun tämän tavan yhdistää curl-komentoon ja loripsum.netin API-rajapintaan, käytettävissä on melko vaikuttava työkalu keinotekoisen datan generoimiseen.

curl http://loripsum.net/api/5 |
wp post generate --post_content --count=10

Kolmantena vaihtoehtona on wp-cli-fixtures, joka on täysimittainen keinodatageneraattori itsessään. Kaiken siihen liittyvän löytää GitHubista.

Bonusvinkki

Tietokannan kehitysversiota ei tule koskaan puskea tuotantoon, ellei ole sataprosenttisen varma siitä, mitä on tekemässä. Yleensä tästä on seurauksena paisunut tietokanta tuotantosivustolla, tai vielä pahempaa, rikkinäinen tietokanta.

Toivottavasti pidit tästä tietokanta-aiheisesta artikkelista. Kommenttipalsta löytyy tuttuun tapaan alapuolelta, ja sitä voi käyttää kysymyksiin ja muuhun palautteeseen. Mikäli sinulla on tarvetta premium-tason ylläpidolle WordPressille, tutustu ihmeessä palvelupaketteihimme.

Comments

Yksi vastaus artikkeliin “13 tietokantavinkkiä WordPressille”

  1. Mikko avatar
    Mikko

    Pro-vinkki: monilla WP-sivustoilla isoin rivi wp_optionsissa on jetpack_file_data, joka voi olla hyvinkin iso. Sen voi poistaa huoletta: Jetpack ei käytä sitä ollenkaan.