Wp_options tablosu için Yavaş Sorgu


16

( 10 long_query_time varsayılan değeri ile) WP tabanlı sitenin yavaş sorgular günlüğünü izledim ve aşağıdaki sorgunun genellikle günlüğe kaydedildiğini fark ettim -

# 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';

Böyle küçük bir tablonun yürütülmesi için nasıl bu kadar zaman alabileceğini anlamıyorum. Bu sadece başka bir sorunun belirtisi mi? (Şu anda özel bir VM'de Moodle, phpbb ve WP çalışıyor).

Yanıtlar:


16

Güncelleme : Sorgunun günlüğe kaydedilmesinin nedeni bir dizin kullanmamasıdır . Sorgu süresi 0'dır, yani aslında hızlı çalışır. Bunların günlüğe kaydedilmesini istemiyorsanız "log-queries-using-indexes" seçeneğinin ayarını kaldırabilirsiniz.

Wp_options tablosunun otomatik yüklemede dizini yoktur, bu nedenle sorgu tam tablo taraması yapar. Genel olarak bu tablo çok büyük olmamalı, bu yüzden bir sorun değil, ama sanırım bu sizin durumunuzda bir şekilde oldu.

Bir dizin eklemek sorunu çözebilir, ancak TheDeadMedic'in yorumlarda belirttiği gibi, otomatik yük değerlerinin çoğunluk evet olması veya evet ile hayır arasında eşit olarak dağıtılması söz konusu olmayabilir:

İlk olarak, dağıtımın neye benzediğini görmek için bu sorguyu yapın:

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

bunların büyük çoğunluğu 'hayır' olarak ayarlanmışsa, şimdilik otomatik yükleme için bir dizin ekleyerek sorunu çözebilirsiniz.

ALTER TABLE wp_options ADD INDEX (`autoload`);

Ancak, bu tablonun neden çok büyüdüğünün altına inmek isteyebilirsiniz. Muhtemelen kötü yazılmış bir eklenti balık yapıyor.


2
Bu durumda bir endeksin herhangi bir kazanç sağlayacağından şüpheliyim - kardinalite hakkındaki bu makaleye göz atın .
TheDeadMedic

Çoğu seçeneğin otomatik yüklemeye ayarlanıp ayarlanmadığına bağlıdır. Ben değil düşünürdüm, ama tabloda zaten bu kadar büyük olmamalı böylece balık bir şey oluyor.
Vinay Pai

1
Değerlerin dağılımını kontrol etme konusunda biraz eklemek için cevap ile güncelledim.
Vinay Pai

1
Sadece yorumu fark ettim ve cevabımın tamamen yanlış olduğunu fark ettim. Sorgu aslında yavaş değil ... sadece yavaş sorgu günlüğüne kaydediliyor çünkü dizin kullanmıyor.
Vinay Pai

1
Bu soru ve cevap sayesinde wp_options tablomda 90k giriş vardı, bunların 88.5k'si autoload false olarak ayarlandı. Geri kalanların tümü eklentiler tarafından eklenen "geçici" girişlerdi (muhtemelen önbellekleme için mi?). Otomatik yükleme sütununa bir dizin eklemek mySql yükümü anında ortalama% 89'dan% 2.5'e düşürdü. İzleme aracıları, sitemin yanıt süresinin 1900ms'den 500ms'ye düştüğünü gösteriyor. Bu benim için bir oyun makinisti.
Mordred

5

Birkaç gün önce sunucumda çalışan mytop belirtilen sorgu tökezledi - ve aslında her sorgu için oldukça (yaklaşık 10 saniye) biraz zaman aldı! Yani wp_options'ın sorunlu boyuta gelebileceği gerçek dünya durumları var. Benim durumumda, önbellek eklentisi Cpify'ın wp_options şişkinliğinden sorumlu olduğundan şüpheleniyorum .

Bu belirli wp_options verileri:

5,309 rows
130MB of data

Bir çözüm olarak, sorunu kusursuz bir şekilde çözen Vinay Pai tarafından yayınlanan çözüme benzer bir indeks ekledim.


1

Wp_options tablomda sadece yaklaşık 235 satır veri vardı. Tabloyu indekslemeyi denedim, ama yardımcı olmadı.

Tabloya yaklaşık 150 geçici seçeneğin eklendiğini, ancak otomatik olarak silinmediğini ortaya koyuyor.

İlişkili olup olmadığını bilmiyorum, ancak /var/log/apache2/access.log dosyalarımı inceliyordum ve birden fazla (muhtemelen tehlikeye atılan) Amazon Web Hizmetleri sunucularının (54 ile başlayan IP adresleri) fark ettim. XXX ve 32.XXX) /~web-root-dir/xmlrpc.php dosyasını kullanmaya çalışıyorlardı.

Bazı sorun giderme işlemlerinden sonra, "geçici" içeren seçenek adları için wp_options tablosunu sorguladım

wp_options arasından * seçin, burada seçenek_adı '% gibi geçici %' gibi;

Bu sorgudan döndürülen alanlardan biri, LONGTEXT veri tipine sahip olan 'option_value'. MySQL belgelerine göre, bir LONGTEXT alanı (her satır için) en fazla 4 Gigabayt veri tutabilir.

Sorguyu yürüttüğümde, bazı satırların ("geçici" içerenlerle çalıştığını hatırlayın) çok büyük option_value alanında miktarda veri . Sonuçlara baktığımda, cp döngüleri sırasında yürütülecekleri umuduyla wp-cron sürecine komut enjekte etme girişimlerinin nasıl göründüğünü de gördüm.

Benim çözümüm "geçici" tüm satırları silmekti. "Geçici" satırlar otomatik olarak yeniden doldurulacağından (orada olmaları gerekiyorsa) sunucuya zarar vermez.

Bunu yaptıktan sonra sunucu bir kez daha yanıt verdi.

Bu satırları silme sorgusu:

Wp_options konumundan DELETE; burada seçenek_adı '% geçici %' gibi;

AWS IP adresini / 8 süper blokları da güvenlik duvarıma ekledim (-:


Evet. Ben her 40 sayfa yüklenen büyük veri ile 20.000 wp_option kayıtları olduğunu keşfetinceye kadar ben de "40 saniye yükleme süresi" muzdarip oldu. Bunları kaldırmak siteyi önemli ölçüde hızlandırdı.
JasonGenX
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.