WordPress sebesség probléma, wp_option tábla

Sok megrendelőnk használ WordPress blog motort, ami nem csoda, hiszen a nemzetközi kimutatások alapján ez az egyik legelterjedtebb ingyenes blog engine, ráadásul adminisztrátori felületünkről egyszerűen telepíthető is. Egy bizonyos látogató szám elérése után azonban nem ritka, hogy sebesség problémák jelentkeznek, amik hatványozottak ha több, esetleg nem jól tesztelt plugin-t telepítün fel.

Az egyik legfőbb probléma a MySQL adatbázis indokolatlan terhelése még akkor is, ha valamilyen cache megoldást már telepítettünk. Az adatbázis log elemzését követően gyorsan kiderül, hogy a nagy számú lekérdezés mögött egyetlen select utasítás áll, ami a konfigurációs paramétereket olvassa. Ez a select gyakorlatilag minden szerverünkön a legtöbbet futtatott sql művelet, naponta átlagosan több mint 750.000-szer fut le.

SELECT option_name, option_value FROM wp_options WHERE autoload = 'S'

Egy gyors, tíz perces időszak elemzése után ezt kapom az egyik szerverünkön:

Count: 16328 Time=0.03s (568s) Lock=0.03s (458s) Rows=385.4 (6292345),
137users@localhost

Az elemzés ideje alatt a lekérdezés 16.328-szor futott, ez összesen 568 másodpercig tartott, ebből 458 másodpercig zárolta a táblát, és a lényeg: eredményül 385 sort adott vissza amihez 6.292.345 sort vizsgált át. Huh, nem valami hatékony!

A gyors megoldást egy index elhelyezése jelenti a wp_options táblán:

create index idx_autoload using hash on wp_options (autoload(3))

Ha az index létrehozása után elemezzük a lekérdezést a MySQL beépített Explain parancsával, akkor már látható, hogy használni fogja az indexet:

explain extended SELECT option_name, option_value
FROM wp_options WHERE autoload = 'yes'
id select_type table type possible_keys key key_len ref rows Extra
 1 SIMPLE wp_options ref idx_autoload idx_autoload 11 const 1670 Using where

A témáról a WordPress support fórumon is találtam bejegyzéseket, talán ez a leghasznosabb bejegyzés: http://wordpress.org/support/topic/prefix-the-length-of-indexes

Kinek érdemes indexet létrehozni?

Ha szerverünkön kíváncsiak vagyunk, hogy ki az a felhasználó akinek létre kéne hoznia ilyen indexet, akkor az alábbi utasítással könnyedén lekérdezhetjük:

grep -B 3 "SELECT option_name, option_value FROM wp_options" \
/var/lib/mysql/slow_queries.log | grep "User" | sort | uniq -c| sort -n | less

Ez után már csak szólnunk kell neki, vagy akár létrehozhatjuk az indexet magunk is, ha van hozzáférésünk.

Kövess minket!