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 merupakanPRIMARY 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
dariVARCHAR(255)
, bukanVARCHAR(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
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