เหตุใดการอัปเดตอย่างง่ายของ“ _edit_lock” ของ wp_postmeta จึงช้ามาก


11

ในบันทึกการสืบค้น MySQL ที่ช้าสุดของเราการสืบค้นที่ช้าที่สุดคือการอัปเดตเป็น wp_postmeta อย่างง่าย นี่คือตัวอย่าง:

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

รายละเอียดที่เกี่ยวข้องในการตั้งค่าของเรา:

  • MySQL ตั้งค่าเวลาสืบค้นช้าเป็น 1 วินาที
  • เครื่องมือเก็บข้อมูลของ wp_postmeta คือ InnoDB
  • ทำงานภายในการติดตั้ง Multisite ขนาดใหญ่ที่มีการโพสต์นับหมื่นบนบล็อก WP หลัก (ที่มีการค้นหาที่ช้าเหล่านี้)
  • กิจกรรมขั้นสูงในพื้นที่ผู้ดูแลระบบ WP (นักเขียน / บรรณาธิการจำนวนมากทำงานพร้อมกัน แต่โดยทั่วไปจะอยู่ในเนื้อหา (ไม่ใช่ของผู้อื่น))
  • กิจกรรมน้อยในด้านสาธารณะของ WP (ไม่แสดงเนื้อหาจากบล็อกหลัก)
  • ข้อความค้นหาที่ช้าดูเหมือนว่าทุกคนใช้คีย์ "_edit_lock" ข้อความค้นหาในรูปแบบเดียวกัน (ที่ใช้รหัสอื่นที่ไม่ใช่ "_edit_lock") ดูเหมือนจะไม่ช้า

ทำไมจึงเป็นคำถามที่ช้าที่สุดในระบบของเรา มันมีบางอย่างเกี่ยวกับการใช้ "การล็อคแก้ไข" โดยเฉพาะของ WP หรือไม่?

ขอบคุณ! :)


อัปเดต: ส่งออกจาก mysqlsla ด้านล่าง:

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

จำนวนผลลัพธ์ที่คุณจะได้รับสำหรับSELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7

ขอบคุณสำหรับคำถามของคุณ adrian7! มี 33k แถวที่ตรงกับคำค้นหาของคุณ ฉันไม่คุ้นเคยกับการใช้เมตาคีย์ '_edit_lock' ของ WP มันผิดปกติหรือไม่
rinogo

ไม่ผิดปกติ wordpress ใช้เพื่อเตือนผู้ใช้เมื่อพวกเขาพยายามแก้ไขโพสต์ / หน้าเดียวกัน ฉันขอแนะนำให้คุณลบ _edit_locks ทั้งหมดจาก wp_postmeta อย่างชัดเจนเมื่อไม่มีใครแก้ไขและตรวจสอบหลังจากปรับปรุงประสิทธิภาพใด ๆ (BTW ทำการสำรองข้อมูลก่อน)
adrian7

3
มันใช้เวลาเป็นจำนวนมากSELECTใช่ไหมเมื่อคุณเพิ่งเข้ามาในรายการนี้? เช่นSELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key= '_edit_lock'; `?
fischi

@fischi: ดูเหมือนว่าจะใช้เวลา 45-50ms อย่างน้อยในการทดสอบที่ฉันเพิ่งทำไม่กี่นาทีที่ผ่านมา อย่างไรก็ตามเป็นไปได้ว่าบางครั้งอาจใช้เวลานานมาก (เช่นนานถึง 84 วินาทีดังที่แสดงในเอาต์พุต mysqlsla ที่รวมอยู่ในคำถาม) ฉันจะเรียกใช้การวิเคราะห์คิวรีแบบช้ารอบใหม่เพื่อดูว่าการเปลี่ยนแปลงล่าสุดของฉันในการกำหนดค่าของเราส่งผลกระทบต่อคิวรีหรือไม่
rinogo

คำตอบ:


3

_edit_lock ถูกสร้างขึ้นทุกครั้งที่คุณแก้ไขโพสต์หรือหน้า ประกอบด้วย timecode และผู้ใช้ ดังนั้น WordPress จึงรู้ว่าใครกำลังแก้ไขอยู่

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

หากคุณจัดการกับ WordPress ตอบสนองอย่างใด ... ฉันพยายามดึงข้อมูลว่ามีคนทำงานกับโพสต์กี่วินาที ทุกครั้งที่ฐานข้อมูลของฉันเสียเวลาโหลด

อย่างที่คุณบอกว่าคุณทำสิ่งนี้บนเว็บไซต์ขนาดใหญ่ ไม่ทราบว่ามีผู้ใช้จำนวนกี่คนเขียนโพสต์ที่นั่น แต่แน่นอนว่ามันอาจทำให้ RAM ของเซิร์ฟเวอร์แตกหักหากผู้ใช้หลายคนแก้ไขโพสต์ในเวลาเดียวกัน

วิธีแก้ไขอาจ: กำจัด _edit_lock

จะปิดการใช้งาน "Post Lock / Edit Lock" ได้อย่างไร?

โดยปกติ WordPress ควรมี "_edit_lock" หนึ่งรายการต่อโพสต์ ฐานข้อมูลบางอย่างมีปัญหาในการสร้างพวกเขาทุกครั้ง

ชอบผู้ชายคนนี้ http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

ทางออกของเขาคือลบพวกเขาทั้งหมด เพื่อเพิ่มความเร็วคุณสามารถลบได้ทุกคืนเวลา 3 นาฬิกาใน phpMyAdmin ด้วย

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

อาจเป็นเพราะคุณพบว่างาน cron ทำตรงนั้น


0

ลองนี้ :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.