Secara umum, sistem yang besar membutuhkan penanganan yang berbeda. Hal ini berlaku pula untuk instalasi CMS WordPress yang telah settle atau memiliki cukup banyak pengunjung tiap harinya. WordPress memiliki banyak keunggulan dibanding produk-produk serupa lainnya, namun sayang sekali memiliki beberapa kelemahan.

Performa Database Menurun
WordPress dibangun dengan tujuan performa tinggi, namun sayangnya untuk jangka panjang, user harus memantau performa database yang bisa saja menurun. Salah satu faktor yang menyebabkan penurunan performa database adalah terdapat orphan data yang tidak secara otomatis dihapus.
Kita tahu bahwa mysql memiliki 2 jenis engine, yaitu InnoDB dan MyISAM. InnoDB memberikan fitur referential integrity, sementara MyISAM mengedepankan performa tanpa referential integrity yang bisa menurunkan kinerja. Nah, secara default database WordPress akan menggunakan MyISAM yang berarti ketika sebuah data dihapus, maka data-data lain yang terkait tidak ikut dihapus, dan inilah yang terkadang menyebabkan performa situs secara keseluruhan menjadi sangat menurun.
Salah satu yang akhir-akhir ini saya temukan adalah menggemuknya transient dan wp_postmeta.
Transient adalah cache atau data temporer untuk fitur pencarian. Singkatnya, semakin banyak pencarian dilakukan di situs wordpress, maka otomatis data transient yang terletak di tabel wp_options akan semakin besar. Tabel wp_options adalah salah satu tabel penting dalam wordpress yang sering diakses, dan biasanya hanya terdiri atas 500-1000 record. Nah, ketika Anda menemukan terlalu banyak record dalam tabel wp_options, maka Anda patut curiga dengan terlalu banyaknya data transient di situ. Namun jangan khawatir, setelah saya googling dan saya praktikkan sendiri, data transient dapat dihapus dengan mudah tanpa merusak instalasi wordpress. Berikut sintaks SQL yang dapat digunakan:
DELETE FROM `wp_options` WHERE `option_name` LIKE ('%\_transient\_%')
Yang kedua, tentang wp_postmeta. Biasanya tabel wp_postmeta memiliki banyak sekali record, bisa sampai puluhan atau ratusan ribu record. Nah, ternyata dari banyak data ini, terdapat orphan data yang dapat dihapus dengan aman. Berikut sintaks SQL yang dapat digunakan:
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL
Dengan mengeksekusi sintaks di atas, kita bisa menghemat sampai puluhan ribu record terhapus dari wp_postmeta, tentu saja tidak perlu sampai merusak instalasi.
Skrip plugin yang tidak efisien
Saya termasuk orang yang gandrung dengan wordpress karena ketersediaan plugin yang amat banyak dan memenuhi hampir semua kebutuhan saya tanpa harus saya buat sendiri. Namun sayangnya, terkadang plugin tersebut dibuat dengan tujuan yang baik namun ditulis asal-asalan. Berikut ini adalah contoh skrip yang bisa membuat situs Anda berat.
$NumberOfDraft = mysql_num_rows(mysql_query("select * from wp_posts where post_status='draft' order by post_date desc"));
Bayangkan jika Anda memiliki banyak sekali post dengan status “draft”, maka tanpa pembatasan atau limit, sumber daya server akan habis terbuang percuma. Untuk ini Anda mungkin membutuhkan sedikit kemampuan pemrograman dan membaca sintaks PHP dan SQL. Tentu saja Anda bisa menghubungi si pembuat plugin untuk menanyakan jika sintaks tersebut bisa diubah, misalnya menjadi seperti ini :
$NumberOfDraft = mysql_num_rows(mysql_query("select * from wp_posts where post_status='draft' order by post_date desc limit 1"));
mysql_slow_queries dan error_log
Bagi Anda yang telah berada di level expert, maka setidaknya ada 2 hal lagi yang perlu diperhatikan, yakni catatan pada folder mysql_slow_queries yang ada di folder tmp dan error_log yang ada di public_html. Kedua hal ini dapat menunjukkan pada user apabila ada yang bermasalah pada instalasi wordpress ataupun ketika kita curiga performanya menurun.
Dengan cara-cara yang telah dibahas, maka diharapkan situs yang dibangun menggunakan wordpress dapat berjalan dan melayani banyak visitor setiap harinya.
UPDATE
Saya merasa perlu mengupdate artikel ini sebagai catatan saya juga. Berikut ini skrip untuk membersihkan tabel wp_term_relationships
DELETE tr FROM wp_term_relationships tr INNER JOIN wp_term_taxonomy tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id) WHERE tt.taxonomy != 'link_category' AND tr.object_id NOT IN (SELECT ID FROM wp_posts);
[…] web hosting bukan perkara mudah, di antaranya saya utarakan dalam post saya. Kita harus benar-benar memperhatikan server load supaya tidak kena suspend dari web host. […]