Tại sao bảng `wp_options` không có chỉ mục trên` autoload`?


15

Ở đầu mỗi trang được WordPress phục vụ, có một lệnh gọi MySQL để tìm nạp các tùy chọn:

SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';

Vì không có chỉ mục trên autoloadcột, MySQL phải tra cứu TẤT CẢ các hàng.

Tôi cũng đã xem qua bình luận của câu trả lời này nói rằng sẽ không có hiệu suất tăng ngay cả khi có một chỉ số.

Trong ứng dụng của mình, tôi đã sử dụng rất nhiều giá trị nhất thời để phục vụ như là một phiên thay thế. Họ đã làm việc rất tốt và tôi có thói quen thu gom rác của riêng mình. Tôi nhận thấy rằng trong wp_optionsbảng, các giá trị nhất thời của tôi (những giá trị bắt đầu bằng _transient_) đều có autoload=no. Tôi hy vọng số lượng hàng trong wp_optionsbảng của tôi sẽ tăng lên khi số lượng người dùng đồng thời tăng lên.

Tôi muốn biết lý do tại sao bảng được thiết kế theo cách này. Và tôi có nên tạo một chỉ mục cho trường hợp cụ thể của mình không?

Câu trả lời:


11

Không có chỉ số vì nhu cầu về nó chưa bao giờ đủ mạnh.

Trong vé số 14258, nó đã được đề xuất, nhưng vì hầu hết các tùy chọn sử dụng autoload=yestheo mặc định, nên dù sao chỉ mục sẽ bị bỏ qua.

Ngoài ra còn có vé vẫn mở # 24044 _Thêm chỉ số vào wp_options để hỗ trợ / cải thiện hiệu suất_ .

Tôi nghĩ bạn nên tạo một chỉ mục. Nó sẽ tồn tại nâng cấp. Nó có thể không giúp ích cho hiệu suất của bạn, nhưng bạn có thể thêm dữ liệu thống kê thực vào vé đó.


Cập nhật tháng 11 năm 2019

Chỉ mục đã được thêm vào WordPress 5.3. Cuối cùng. Xem vé # 24044 được đề cập ở trên và ghi chú của nhà phát triển cho bản phát hành .

Lưu ý rằng nếu bạn có một chỉ mục hiện có cùng tên, bạn sẽ nhận được cảnh báo trong quá trình nâng cấp.

Từ changeset :

Hầu hết các trang web sẽ không bị ảnh hưởng bởi thay đổi này, nhưng những trang web có số lượng hàng lớn wp_options, chỉ một số ít trong số đó đã autoloadđược đặt, sẽ thấy sự cải thiện hiệu suất đáng kể.
Các trang web có số lượng hàng lớn wp_options, trong đó nhiều trang đã autoloadđược đặt sẽ không may thấy hình phạt về hiệu suất đối với các truy vấn rất chậm mà chúng đang chạy, nhưng đây phải là trường hợp thiểu số.


1
Theo như tôi có thể biết từ khi đọc đến # 24044, các bảng MyISAM cũ sẽ có được hồi quy hiệu suất, các bảng InnoDB mới chủ yếu sẽ có lợi. Tôi đang chuyển đổi tất cả các bảng kế thừa của mình sang InnoDB và đặt chỉ mục trên autoloadcột.
lkraav

Sau nhiều năm, cuối cùng nó cũng được nhóm WordPress giải quyết. Một chỉ mục đã được thêm vàowp_options.autoload . Nguồn: make.wordpress.org/core/2019/10/15/15 ... và ... core.trac.wordpress.org/ticket/24044#comment:87 ... Kudos gửi @DanBUK , người đã đề xuất tính năng này vào năm 2013.
Jee

Cảm ơn, @Jee, tôi đã cập nhật câu trả lời.
fuxia

5

Tôi đang chạy 3 blog WP trên một ví dụ lớn về Debian Squeeze và đang tìm hiểu lý do tại sao mysql bị kẹt trên máy chủ đó với mức sử dụng CPU 200% và tải hệ thống trong khoảng từ 3 đến 6. Nhìn vào 'danh sách quy trình hiển thị' bên trong mysql, chúng tôi hiểu Bảng wp_option có liên quan đến vấn đề này nên chúng tôi đã thực hiện:

alter table wp_options add index autoload_idx(`autoload`);

Sau hoạt động này, tải mys mys như thể hiện trong top giảm mạnh xuống 1% và trung bình tải hiện tại là 0,10.

Chúng tôi đang sử dụng một số plugin để có thể có một vòng lặp ở đâu đó trong mã và đây có thể là một tình huống cụ thể, nhưng trong trường hợp của chúng tôi, sự thay đổi trong hiệu suất là hoàn toàn đáng kinh ngạc.

Bảng wp_options của chúng tôi có 347 hàng.


2
Cám ơn vì đã chia sẻ. Tôi hình dung WordPress đã có một khiếm khuyết trong việc xử lý bảng tùy chọn này. Nó quá nhỏ, không nên truy vấn. Nó nên là select *một lần cho tất cả. Thay vào đó, nó truy vấn cho từng tùy chọn, đó là lý do tại sao việc đặt một chỉ mục sẽ tạo ra sự khác biệt lớn.
Anh ấy lung linh

0

Mặc dù @fuxia chấp nhận câu trả lời chạm vào một số lý do "được yêu cầu" (hầu hết trong số đó được các nhân viên của Automattic yêu cầu trên các vé Trac khác nhau, v.v.), lý do cơ bản cho WordPress Core không bao gồm chỉ mục cho các tùy chọn tự động tải trong wp_optionsbảng là vì Automattic lo lắng nó sẽ ảnh hưởng tiêu cực đến hiệu suất của cơ sở dữ liệu MySQL vẫn đang sử dụng công cụ MyISAM.

Cụ thể, họ chỉ vào trang web WordPress.org, là một cơ sở dữ liệu rất cũ / phức tạp, như một trang web mẫu có hiệu suất sẽ bị tổn thương bởi một chỉ mục như vậy.

Gần như tất cả các lý do khác để không thêm chỉ số trong 9 năm qua (vâng, kể từ năm 2010 trong trường hợp vé Trac # 14258 và kể từ năm 2013 trong trường hợp vé Trac # 24044 ) liên tục được chứng minh là không chính xác bởi hàng chục thành viên của Cộng đồng WordPress, nhưng các nhân viên của Automattic liên quan đã bỏ qua nhiều lần kiểm tra điểm chuẩn độc lập và quay trở lại đề cập đến mối quan tâm của MyISAM.

Rất may, vào cuối năm 2019 với PHP 7.2, phiên bản "mặc định" được đề xuất bởi WordPress Core và với công cụ InnoDB hiện được mặc định trong các phiên bản MySQL sau 5.5 và với áp lực liên tục từ các nhà phát triển khác nhau, bao gồm cả @DanBUK, người đã gặp vấn đề trong nhiều năm , Automattic cuối cùng đã nhượng bộ và quyết định thêm chỉ mục tự động tải kể từ WordPress 5.3+ vào tháng 11 năm 2019.

Chúng tôi tại LittleBizzy đã ra mắt plugin được biết đến đầu tiên tự động thêm chỉ mục nếu nó không tồn tại, nó vẫn có sẵn trên GitHub và được tải xuống thường xuyên. Xin lưu ý rằng bạn KHÔNG CẦN PHẢI cài đặt các plugin như vậy vào ngăn xếp WordPress của bạn nếu bạn đang chạy WP Core 5.3 + ...

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.