Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tại sao các tham chiếu đến wp_postmeta quá chậm?

Lược đồ chuẩn cho wp_postmeta cung cấp các chỉ số kém. Điều này dẫn đến các vấn đề về hiệu suất.

Bằng cách thay đổi lược đồ thành này, hầu hết các tham chiếu đến dữ liệu meta sẽ nhanh hơn:

CREATE TABLE wp_postmeta (
    post_id …,
    meta_key …,
    meta_value …,
    PRIMARY KEY(post_id, meta_key),
    INDEX(meta_key)
) ENGINE=InnoDB;

Ghi chú:

  • AUTO_INCREMENT hiện tại rất tốn dung lượng và làm chậm các truy vấn vì nó là PRIMARY KEY , do đó tránh PK "tự nhiên" "tổng hợp" của (post_id, meta_key) .
  • InnoDB tăng cường hơn nữa hiệu suất của PK đó do "phân cụm". (Tôi hy vọng bạn vẫn không sử dụng MyISAM!)
  • Nếu bạn đang sử dụng MySQL 5.6 (Hoặc MariaDB 10.0 hoặc 10.1), hãy thay đổi meta_key từ VARCHAR(255) , không phải VARCHAR(191) . (Chúng ta có thể thảo luận về lý do và cách giải quyết, trong một câu hỏi riêng, nếu 191 là không đủ.)
  • INDEX(meta_key) là tùy chọn, nhưng cần thiết nếu bạn muốn "tìm các bài đăng có một khóa cụ thể".
  • Lưu ý:Những thay đổi này sẽ tăng tốc nhiều sử dụng postmeta, nhưng không phải tất cả. Tôi không nghĩ nó sẽ làm chậm bất kỳ trường hợp sử dụng nào. (Vui lòng cung cấp các truy vấn như vậy nếu bạn gặp phải. Đó có thể là vấn đề về bộ nhớ đệm, không phải do suy thoái thực sự.)

Nếu bạn muốn giới thiệu của bạn CREATE TABLE , Tôi có thể cung cấp ALTER để chuyển đổi nó thành cái này.

Nếu bạn cần khả năng có nhiều khóa meta có cùng tên khóa cho một bài đăng, thì hãy sử dụng giải pháp này. Nó gần tốt như gợi ý ở trên.

    meta_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,  -- keep after all
    ...
    PRIMARY KEY(post_id, meta_key, meta_id),  -- to allow dup meta_key for a post

Nguồn doc

ALTER có thể xảy ra

Lưu ý:

  • Tôi không có cách nào để kiểm tra điều này.
  • Điều này không giải quyết được lỗi 767
  • Điều này giữ meta_id bởi vì một số người dùng WP đã chỉ ra rằng nó được các bảng khác tham chiếu.
  • Nó giả định rằng bạn có thể có nhiều hàng cho một tổ hợp (post_id, meta_key). (Đây có vẻ là thiết kế giản đồ kém?)
  • Tất cả những việc này là tăng tốc các SELECTs điển hình liên quan đến postmeta.
  • Điều này cũng có thể áp dụng cho thương mại điện tử.
  • Nếu bạn sử dụng điều này, vui lòng kết xuất cơ sở dữ liệu của bạn và sẵn sàng tải lại trong trường hợp có sự cố.

SQL:

ALTER TABLE wp_postmeta
    DROP PRIMARY KEY,
    DROP INDEX post_id,
    ADD PRIMARY KEY(post_id, meta_key, meta_id),  -- to allow dup meta_key for a post
    ADD INDEX(meta_id);    -- to keep AUTO_INCREMENT happy



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL kiểm tra xem có nhiều hàng tồn tại không

  2. Các cột đã chọn không có loại tương thích, ngay cả khi nó có cùng loại

  3. Sắp xếp các bản ghi truy vấn SQL theo tần suất

  4. Kết quả group_concat không hoạt động trong điều kiện IN

  5. Lỗi cú pháp MySQL trên DELIMITER trước khi TẠO TRIGGER