Mengapa pembaruan sederhana ke "_edit_lock" wp_postmeta begitu lambat?

11

Di log kueri lambat MySQL kami, kueri kumulatif paling lambat adalah pembaruan sederhana ke wp_postmeta. Ini sebuah contoh:

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

Detail yang relevan pada pengaturan kami:

  • Waktu permintaan MySQL lambat diatur ke 1s
  • mesin penyimpanan wp_postmeta adalah InnoDB
  • Berjalan di dalam instalasi Multisite besar dengan puluhan ribu posting di blog WP utama (di mana permintaan lambat ini terjadi)
  • Aktivitas tinggi di area admin WP (banyak penulis / editor bekerja secara bersamaan, tetapi umumnya pada konten mereka sendiri (bukan yang lain))
  • Aktivitas rendah di sisi publik WP (tidak benar-benar menyajikan konten dari blog utama)
  • Semua pertanyaan lambat tampaknya menggunakan kunci "_edit_lock"; kueri dengan format yang sama (yang menggunakan kunci selain "_edit_lock") tampaknya tidak lambat.

Mengapa ini adalah permintaan paling lambat pada sistem kami? Apakah ada hubungannya dengan penggunaan khusus "edit kunci" WP?

Terima kasih! :)


Pembaruan: Output dari mysqlsla di bawah ini:

______________________________________________________________________ 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';
rinogo
sumber
Berapa banyak hasil yang Anda dapatkan SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7
Terima kasih atas pertanyaan Anda, adrian7! Ada 33k baris yang cocok dengan kueri Anda. Saya tidak terbiasa dengan penggunaan kunci meta '_edit_lock' WP. Apakah ini abnormal?
rinogo
itu tidak abnormal, wordpress menggunakannya untuk mengingatkan pengguna ketika mereka mencoba mengedit posting / halaman yang sama. Saya sarankan Anda menghapus semua _edit_locks dari wp_postmeta, jelas ketika tidak ada yang mengedit dan memeriksa setelah ada peningkatan kinerja. (BTW membuat cadangan terlebih dahulu).
adrian7
3
Apakah ini juga membutuhkan banyak waktu ketika Anda baru saja SELECTentri ini? Seperti SELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key= '_edit_lock'; `?
fischi
@ Fischi: Permintaan itu tampaknya mengambil 45-50ms, setidaknya dalam pengujian saya baru saja melakukan beberapa saat yang lalu. Namun, ada kemungkinan bahwa kadang-kadang akan memakan waktu yang sangat lama (misalnya hingga 84 detik, seperti yang ditunjukkan pada output mysqlsla yang termasuk dalam pertanyaan). Saya akan menjalankan putaran baru analisis kueri lambat untuk melihat apakah ada perubahan baru-baru ini pada konfigurasi kami yang memengaruhi kueri.
rinogo

Jawaban:

3

_edit_lock dihasilkan setiap kali Anda mengedit posting atau halaman. itu terdiri kode waktu dan pengguna. jadi WordPress mengetahui siapa yang sedang mengeditnya.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

jika Anda memanipulasinya WordPress bereaksi entah bagaimana sensitif ... Saya mencoba untuk mengambil berapa detik seseorang bekerja pada sebuah posting. Semua waktu itu merusak waktu pemuatan basis data saya.

Seperti yang Anda katakan Anda menjalankan ini pada multisite besar. Tidak tahu berapa banyak pengguna menulis posting di sana, tetapi pasti bisa merusak RAM server jika banyak orang mengedit posting pada saat yang sama.

Solusi dapat berupa: singkirkan _edit_lock

Bagaimana cara menonaktifkan "Kunci Posting / Edit Kunci"?

Biasanya WordPress harus memiliki "_edit_lock" satu per Posting. Beberapa database memiliki masalah menghasilkannya setiap waktu.

Suka pria ini http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

Solusinya adalah menghapus semuanya. Untuk mempercepatnya, Anda dapat menghapusnya setiap malam pada jam 3 di phpMyAdmin with

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

mungkin Anda menemukan pekerjaan cron melakukan hal itu.

seot
sumber
0

coba ini :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
demopix
sumber