Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Mengapa referensi ke wp_postmeta sangat lambat?

Skema standar untuk wp_postmeta memberikan indeks yang buruk. Hal ini menyebabkan masalah kinerja.

Dengan mengubah skema ini, sebagian besar referensi ke meta data akan lebih cepat:

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

Catatan:

  • AUTO_INCREMENT saat ini kolom adalah pemborosan ruang, dan memperlambat kueri karena merupakan PRIMARY KEY , dengan demikian menghindari PK "alami" "komposit" dari (post_id, meta_key) .
  • InnoDB semakin meningkatkan kinerja PK tersebut karena "pengelompokan". (Saya harap Anda tidak masih menggunakan MyISAM!)
  • Jika Anda menggunakan MySQL 5.6 (Atau MariaDB 10.0 atau 10.1), ubah meta_key dari VARCHAR(255) , bukan VARCHAR(191) . (Kita dapat mendiskusikan alasan, dan solusi, dalam pertanyaan terpisah, jika 191 tidak cukup.)
  • INDEX(meta_key) bersifat opsional, tetapi diperlukan jika Anda ingin "menemukan postingan yang memiliki kunci tertentu".
  • Peringatan:Perubahan ini akan mempercepat banyak penggunaan postmeta, tetapi tidak semua. Saya tidak berpikir itu akan memperlambat kasus penggunaan apa pun. (Harap berikan pertanyaan seperti itu jika Anda menemukannya. Ini bisa menjadi masalah caching, bukan penurunan yang nyata.)

Jika Anda ingin menunjukkan Anda CREATE TABLE , saya dapat memberikan ALTER untuk mengubahnya menjadi ini.

Jika Anda memerlukan kemampuan untuk memiliki beberapa kunci meta dengan nama kunci yang sama untuk satu posting, gunakan solusi ini. Ini hampir sebagus saran di atas.

    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

Dokumen sumber

Kemungkinan ALTER

Peringatan:

  • Saya tidak punya cara untuk menguji ini.
  • Ini tidak mengatasi kesalahan 767
  • Ini menjaga meta_id karena beberapa pengguna WP menunjukkan bahwa itu direferensikan oleh tabel lain.
  • Ini mengasumsikan Anda mungkin memiliki beberapa baris untuk kombo (post_id, meta_key). (Ini sepertinya desain skema yang buruk?)
  • Yang dilakukan hanyalah mempercepat SELECTs typical melibatkan postmeta.
  • Ini mungkin juga berlaku untuk woocommerce.
  • Jika Anda menggunakan ini, harap buang database Anda dan bersiaplah untuk memuat ulang jika terjadi masalah.

SQLnya:

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. Bagaimana cara membersihkan atau mengubah ukuran file ibtmp1 di MySQL?

  2. MySQL mencocokkan 2 dari 5 bidang

  3. Jenis apa yang akan Anda petakan BigDecimal di Java/Hibernate di MySQL?

  4. Bagaimana cara kerja indeks MySQL?

  5. Ketika mysql_query mengembalikan false