wp_postmeta
の標準スキーマ 貧弱なインデックスを提供します。これはパフォーマンスの問題につながります。
スキーマをこれに変更することで、メタデータへのほとんどの参照が高速になります:
CREATE TABLE wp_postmeta (
post_id …,
meta_key …,
meta_value …,
PRIMARY KEY(post_id, meta_key),
INDEX(meta_key)
) ENGINE=InnoDB;
注:
- 現在の
AUTO_INCREMENT
列はスペースの無駄であり、PRIMARY KEY
であるため、クエリの速度が低下します。 、これにより、(post_id, meta_key)
の「自然な」「複合」PKを回避します。 。 - InnoDBは、「クラスタリング」により、そのPKのパフォーマンスをさらに向上させます。 (まだMyISAMを使用していないことを願っています!)
- MySQL 5.6(またはMariaDB 10.0または10.1)を使用している場合は、
meta_key
を変更します。VARCHAR(255)
から 、VARCHAR(191)
ではありません 。 (191が十分でない場合は、別の質問で理由と回避策について説明できます。) -
INDEX(meta_key)
オプションですが、「特定のキーを持つ投稿を検索する」場合に必要です。 - 警告:これらの変更により、多くの速度が向上します。 postmetaの使用ですが、すべてではありません。私は考えない ユースケースが遅くなります。 (このようなクエリが発生した場合は、提供してください。実際の劣化ではなく、キャッシュの問題である可能性があります。)
あなたのを提示したい場合 CREATE TABLE
、ALTER
を提供できます これに変換します。
1つの投稿に同じキー名を持つ複数のメタキーを使用する機能が必要な場合は、このソリューションを使用してください。上記の提案とほぼ同じです。
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
可能なALTER
警告:
- これをテストする方法がありません。
- これは767エラーに対処していません
- これにより、
meta_id
が保持されます 一部のWPユーザーが、他のテーブルから参照されていると指摘したためです。 - (post_id、meta_key)コンボに複数の行がある可能性があることを前提としています。 (これは不十分なスキーマ設計のように思われますか?)
- これは、一般的な
SELECTs
を高速化することだけです。 postmetaを含む。 - これはおそらくwoocommerceにも当てはまります。
- これを使用する場合は、データベースをダンプして、問題が発生した場合に備えてリロードする準備をしてください。
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