Wp_postmeta'nın “_edit_lock” u için basit güncellemeler neden bu kadar yavaş?


11

MySQL yavaş sorgu günlüğümüzde, kümülatif olarak en yavaş sorgu wp_postmeta için basit bir güncellemedir. İşte bir örnek:

UPDATE `wp_postmeta`
  SET `meta_value` = '1392835505:386'
  WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';

Kurulumumuzla ilgili ayrıntılar:

  • MySQL yavaş sorgu süresi 1s olarak ayarlandı
  • wp_postmeta'nın depolama motoru InnoDB
  • Ana WP blogunda (bu yavaş sorguların oluştuğu) onbinlerce gönderi ile büyük bir Çok Bölmeli kurulumda çalışıyor
  • WP yönetici alanında yüksek etkinlik (aynı anda çalışan, ancak genellikle kendi (başkalarının değil) içeriğinde çalışan birçok yazar / editör)
  • WP'nin genel tarafında düşük etkinlik (aslında ana blogdan içerik sunmamak)
  • Yavaş sorguların tümü "_edit_lock" anahtarını kullanıyor gibi görünüyor; aynı biçimdeki sorgular ("_edit_lock" dışında bir anahtar kullanan) yavaş görünmüyor.

Neden sistemimizdeki en yavaş sorgu budur? WP'nin "düzenleme kilitlerini" özel kullanımı ile bir ilgisi var mı?

Teşekkürler! :)


Güncelleme: Aşağıdaki mysqlsla çıktı:

______________________________________________________________________ 001 ___
Count         : 606  (16.83%)
Time          : 2257.760468 s total, 3.725677 s avg, 1.00512 s to 84.645869 s max  (20.60%)
  95% of Time : 1355.289277 s total, 2.357025 s avg, 1.00512 s to 12.343604 s max
Lock Time (s) : 182.502 ms total, 301 μs avg, 29 μs to 157.542 ms max  (0.21%)
  95% of Lock : 22.882 ms total, 40 μs avg, 29 μs to 57 μs max
Rows sent     : 0 avg, 0 to 0 max  (0.00%)
Rows examined : 1 avg, 1 to 2 max  (0.00%)
Database      : xxx_wp
Users         :
        xxx_wp@localhost  : 98.84% (599) of query, 51.03% (1837) of all users
        yyy_wp@localhost  : 1.16% (7) of query, 0.94% (34) of all users

Query abstract:
SET timestamp=N; UPDATE wp_postmeta SET meta_value = 'S' WHERE post_id = N AND meta_key = 'S';

Query sample:
SET timestamp=1392835506;
UPDATE `wp_postmeta` SET `meta_value` = '1392835505:386' WHERE `post_id` = 94705 AND `meta_key` = '_edit_lock';

Kaç sonuç elde edersiniz SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7

Sorunuz için teşekkürler, adrian7! Sorgunuzla eşleşen 33 bin satır var. WP '_edit_lock' meta anahtar kullanımını bilmiyorum. Bu anormal mi?
rinogo

anormal değil, wordpress aynı yayını / sayfayı düzenlemeye çalışırken kullanıcıları uyarmak için kullanıyor. Tüm _edit_lock'ları wp_postmeta'dan silmenizi öneririm, tabii ki hiç kimse olmadığında ve herhangi bir performans iyileştirmesinden sonra kontrol edin. (BTW önce bir yedek oluşturur).
adrian7

3
Sadece SELECTbu giriş için çok fazla zaman alıyor mu? Gibi SELECT * FROM wp_postmeta` NEREDE post_id= 94705 VE meta_key`; = '_edit_lock'?
fischi

@fischi: Bu sorgu 45-50 ms sürüyor, en azından birkaç dakika önce yaptığım testte. Bununla birlikte, zaman zaman çok uzun zaman alabilir (örneğin, soruya dahil olan mysqlsla çıktısında gösterildiği gibi 84 saniyeye kadar). Yapılandırmamdaki son değişikliklerden herhangi birinin sorguları etkilediğini görmek için yeni bir yavaş sorgu analizi turu yapacağım.
rinogo

Yanıtlar:


3

_edit_lock, bir yayını veya sayfayı her düzenlediğinizde oluşturulur. zaman kodunu ve kullanıcıyı içerir. bu yüzden WordPress şu anda kimin düzenlediğini biliyor.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

Eğer onu manipüle ederseniz WordPress bir şekilde hassas tepki veriyor ... Birisinin bir yazı üzerinde kaç saniye çalıştığını almaya çalıştım. Her zaman benim veritabanı yükleme zaman kırdı.

Söylediğiniz gibi bunu büyük bir çok sitede çalıştırıyorsunuz. Orada kaç kullanıcının mesaj yazdığını bilmiyorum, ancak aynı anda birçok kişiye bir yazı düzenlerse kesinlikle sunucunun RAM'ini kırabilir.

Bir çözüm olabilir: _edit_lock'tan kurtulun

"Post Kilidi / Düzen Kilidi" nasıl devre dışı bırakılır?

Normalde WordPress'te her Yazı için "_edit_lock" olmalıdır. Bazı veritabanlarının her seferinde bunları oluşturma sorunu vardır.

Bu adam gibi http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

Onun çözümü hepsini silmekti. Hızlandırmak için hepsini phpMyAdmin'de her gece saat 3'te silebilirsiniz.

DELETE FROM `yourdb`.`wp_postmeta` WHERE `wp_postmeta`.`meta_key` = '_edit_lock'

belki de tam olarak bunu yapan bir cron işi bulursunuz.


0

bunu dene :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
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.