Tại sao các bản cập nhật đơn giản cho wp_postmeta's Hồi _edit_lock 'lại chậm như vậy?


11

Trong nhật ký truy vấn chậm MySQL của chúng tôi, truy vấn chậm nhất tích lũy là một bản cập nhật đơn giản cho wp_postmeta. Đây là một ví dụ:

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

Chi tiết liên quan về thiết lập của chúng tôi:

  • Thời gian truy vấn chậm của MySQL được đặt thành 1 giây
  • Công cụ lưu trữ của wp_postmeta là InnoDB
  • Chạy trong một cài đặt Multisite lớn với hàng chục ngàn bài đăng trên blog WP chính (nơi xảy ra các truy vấn chậm này)
  • Hoạt động cao trong khu vực quản trị WP (rất nhiều nhà văn / biên tập viên làm việc đồng thời, nhưng nói chung là về nội dung của chính họ (không phải của người khác))
  • Hoạt động thấp ở phía công cộng của WP (không thực sự phục vụ nội dung từ blog chính)
  • Các truy vấn chậm dường như đều đang sử dụng khóa "_edit_lock"; các truy vấn có cùng định dạng (sử dụng khóa khác với "_edit_lock") dường như không bị chậm.

Tại sao đây là truy vấn chậm nhất trên hệ thống của chúng tôi? Nó có liên quan gì đến việc sử dụng "chỉnh sửa khóa" cụ thể của WP không?

Cảm ơn! :)


Cập nhật: Đầu ra từ mysqlsla bên dưới:

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

Bạn nhận được bao nhiêu kết quả SELECT * FROM wp_postmeta WHERE meta_key='_edit_lock'; ?
adrian7

Cảm ơn câu hỏi của bạn, adrian7! Có 33k hàng phù hợp với truy vấn của bạn. Tôi không quen với việc sử dụng khóa meta '_edit_lock' của WP. Đây có phải là bất thường?
rinogo

Không có gì bất thường, wordpress sử dụng nó để cảnh báo người dùng khi họ đang cố chỉnh sửa cùng một bài đăng / trang. Tôi khuyên bạn nên xóa tất cả _edit_locks khỏi wp_postmeta, rõ ràng khi không có ai chỉnh sửa và kiểm tra sau bất kỳ cải tiến hiệu suất nào. (BTW tạo bản sao lưu trước).
adrian7

3
Nó cũng mất một lượng lớn thời gian khi bạn chỉ cần SELECTmục này? Giống như SELECT * FROM wp_postmeta` WHERE post_id= 94705 AND meta_key= '_edit_lock'; `?
fischi

@fischi: Truy vấn đó dường như mất từ ​​45-50ms, ít nhất là trong thử nghiệm tôi mới thực hiện vài phút trước. Tuy nhiên, có thể đôi khi sẽ mất một thời gian rất dài (ví dụ lên tới 84 giây, như thể hiện trong đầu ra mysqlsla có trong câu hỏi). Tôi sẽ chạy một vòng phân tích truy vấn chậm mới để xem liệu có bất kỳ thay đổi nào gần đây đối với cấu hình của chúng tôi đã ảnh hưởng đến các truy vấn không.
rinogo

Câu trả lời:


3

_edit_lock được tạo mỗi khi bạn chỉnh sửa bài đăng hoặc trang. nó bao gồm mã thời gian và người dùng. vì vậy WordPress đang biết ai đang chỉnh sửa nó.

meta_id     post_id     meta_key    meta_value
9           5           _edit_lock  1388386997:1

nếu bạn thao tác với nó, WordPress sẽ phản ứng theo cách nào đó nhạy cảm ... Tôi đã cố gắng tìm nạp bao nhiêu giây ai đó làm việc trên một bài đăng. Tất cả thời gian nó đã phá vỡ thời gian tải cơ sở dữ liệu của tôi.

Như bạn đã nói bạn chạy cái này trên một multisite lớn. Không biết có bao nhiêu người dùng viết bài đăng ở đó, nhưng nó chắc chắn có thể phá vỡ RAM của máy chủ nếu nhiều người chỉnh sửa bài đăng cùng một lúc.

Một giải pháp có thể là: thoát khỏi _edit_lock

Làm cách nào để tắt "Khóa bài / Khóa chỉnh sửa"?

Thông thường WordPress nên có một "_edit_lock" cho mỗi bài đăng. Một số cơ sở dữ liệu có vấn đề tạo ra chúng mỗi lần.

Thích anh chàng này http://wordpress.org/support/topic/can-i-remove-_edit_lock-_edit_last-from-wp_postmeta

Giải pháp của anh là xóa tất cả. Để tăng tốc, bạn có thể xóa tất cả chúng mỗi đêm vào lúc 3 giờ bằng phpMyAdmin với

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

có thể bạn tìm thấy một công việc định kỳ làm chính xác điều đó.


0

thử đi :)

UPDATE `wp_postmeta` 
    SET `meta_value` = concat(unix_timestamp(),':386')  
    WHERE `post_id`  = 94705 
      AND `meta_key` = '_edit_lock';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.