Permintaan lambat untuk tabel wp_options


16

Saya telah melacak log kueri lambat dari situs berbasis WP (dengan nilai default dari long_query_time diatur ke 10), dan saya perhatikan bahwa kueri berikut sering mendapatkan log -

# User@Host: root[root] @ localhost []
# Query_time: 0  Lock_time: 0  Rows_sent: 394  Rows_examined: 458
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

Saya tidak mengerti bagaimana meja sekecil itu dapat menghabiskan banyak waktu untuk mengeksekusi. Apakah ini hanya gejala dari beberapa masalah lain? (Saat ini menjalankan Moodle, phpbb, dan WP pada VM khusus).

Jawaban:


16

Pembaruan : Alasan permintaan dicatat adalah karena tidak menggunakan indeks . Waktu kueri adalah 0, artinya waktu sebenarnya dieksekusi cepat. Anda dapat menghapus opsi "log-queries-not-using-indexes" jika Anda tidak ingin ini dicatat.

Tabel wp_options tidak memiliki indeks pada pengisian otomatis, sehingga kueri akhirnya melakukan pemindaian tabel penuh. Secara umum meja itu tidak boleh terlalu besar, jadi itu bukan masalah, tapi saya menduga itu entah bagaimana terjadi dalam kasus Anda.

Menambahkan indeks mungkin bisa menyelesaikan masalah, tetapi seperti yang ditunjukkan TheDeadMedic di komentar, mungkin tidak jika nilai pengisian otomatis mayoritas ya, atau didistribusikan secara merata antara ya dan tidak:

Pertama, lakukan kueri ini untuk melihat seperti apa distribusi itu:

SELECT COUNT(*), autoload FROM wp_options GROUP BY autoload;

jika sebagian besar dari mereka diatur ke 'tidak', Anda dapat menyelesaikan masalah untuk saat ini dengan menambahkan indeks pada pengisian otomatis.

ALTER TABLE wp_options ADD INDEX (`autoload`);

Namun, Anda mungkin ingin mengetahui mengapa tabel itu terlalu besar. Mungkin beberapa plugin yang ditulis dengan buruk melakukan sesuatu yang mencurigakan.


2
Saya ragu indeks dalam hal ini akan menawarkan keuntungan - lihat artikel ini pada kardinalitas .
TheDeadMedic

Tergantung pada apakah sebagian besar opsi disetel untuk diisi ulang otomatis atau tidak. Saya pikir tidak, tetapi di meja tidak seharusnya menjadi begitu besar sehingga sesuatu yang mencurigakan sedang terjadi.
Vinay Pai

1
Saya memperbarui dengan jawaban untuk menambahkan sedikit tentang memeriksa distribusi nilai.
Vinay Pai

1
Saya hanya memperhatikan komentar itu, dan menyadari jawaban saya sepenuhnya salah. Permintaan sebenarnya tidak lambat ... itu hanya dicatat di log permintaan lambat karena tidak menggunakan indeks.
Vinay Pai

1
Berkat pertanyaan dan jawaban ini, saya menemukan ada 90 ribu entri di tabel wp_options saya, 88,5 ribu di antaranya disetel ke autoload false. Sisanya adalah semua entri "sementara" yang ditambahkan oleh plugin (mungkin untuk caching?). Menambahkan indeks ke kolom pengisian otomatis menjatuhkan beban mySql saya dari rata-rata 89% menjadi 2,5% secara instan. Agen pemantau menunjukkan waktu respons situs saya turun dari 1900 ms menjadi 500 ms. Ini adalah gamechanger bagi saya.
Mordred

5

Saya menemukan kueri yang disebutkan di mytop yang berjalan di server saya beberapa hari yang lalu - dan sebenarnya butuh beberapa waktu (sekitar 10 detik) untuk setiap kueri! Jadi ada situasi dunia nyata di mana wp_options dapat tumbuh ke ukuran yang bermasalah. Dalam kasus saya, saya menduga plugin caching Cachify bertanggung jawab atas kembungnya wp_options.

Data dari wp_options khusus ini:

5,309 rows
130MB of data

Sebagai solusi, saya menambahkan indeks yang mirip dengan solusi yang diposting oleh Vinay Pai, yang memecahkan masalah dengan sempurna.


1

Tabel wp_options saya hanya memiliki sekitar 235 baris data. Saya mencoba mengindeks tabel, tetapi tidak membantu.

Ternyata sekitar 150 opsi sementara telah dimasukkan ke dalam tabel, tetapi belum dihapus secara otomatis.

Saya tidak tahu apakah itu terkait atau tidak, tetapi saya telah mencari melalui file /var/log/apache2/access.log saya dan memperhatikan bahwa beberapa server Amazon Web Services (mungkin dikompromikan) (alamat IP dimulai dengan 54. XXX dan 32.XXX) telah mencoba mengeksploitasi / ~ web-root-dir/xmlrpc.php.

Setelah beberapa pemecahan masalah, saya menanyakan tabel wp_options untuk nama opsi yang berisi "transient"

pilih * dari wp_options di mana option_name seperti '% transient %';

Salah satu bidang yang dikembalikan dari kueri ini adalah 'option_value' yang memiliki tipe data LONGTEXT. Menurut dokumen mySQL, bidang LONGTEXT (untuk setiap baris) dapat menampung hingga 4-Gigabytes data.

Ketika saya mengeksekusi query, beberapa baris (ingat bekerja dengan yang mengandung "transient") memiliki sejumlah besar data di bidang option_value. Melihat melalui hasil, saya juga melihat apa yang tampak seperti upaya untuk menyuntikkan perintah ke dalam proses wp-cron dengan harapan mereka akan dieksekusi selama siklus cron (s).

Solusi saya adalah menghapus semua baris "sementara". Ini tidak akan melukai server karena baris "transient" akan secara otomatis terisi kembali (jika seharusnya ada di sana).

Setelah melakukan ini, server sekali lagi responsif.

Permintaan untuk menghapus baris ini:

HAPUS dari wp_options di mana option_name seperti '% transient %';

Saya telah menambahkan alamat AWS IP / 8 superblok ke firewall saya juga (-:


Ya. Saya juga menderita "40 detik waktu muat" sampai saya menemukan saya memiliki 20.000 catatan wp_option dengan data besar di dalamnya yang dimuat dengan setiap halaman. Menghapus yang sangat mempercepat situs.
JasonGenX
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.