いつ見せるか データベースのインデックス WordPressのクエリが顕著に速くなり、どのシナリオでパフォーマンスが低下するか。MySQLの明確なルール、典型的なWPテーブル、そして試行錯誤を重ねたチェックを用いて、インデックスが適切かどうか、あるいはもっと良い方法があるかどうかを判断する。 代替案 助ける。.
中心点
データベースに手を加える前に、私は以下のことを明確に定義している。 目標 と実際の値を測定する。インデックスが最大の価値を発揮する場所であるため、私は読み込みの多いクエリを優先している。 効果. .インデックスを追加するたびに挿入や更新のスピードが落ちるので、書き込み集中型のテーブルは慎重に扱う。をチェックするよりも小さなテーブルをスキャンする方が速いので、小さなテーブルは変更しないことが多い。 インデックス. .そして、データアクセスを持続的に最適化するために、インデックスとキャッシュを組み合わせている。 下げる.
- 読書量 優先順位WHERE, JOIN, ORDER BY 優先順位
- 選択性 チェック:重複する値はほとんどない。
- オーバーヘッド ノート筆記が遅くなる
- wp_postmeta で、wp_options を特別に扱う。
- 説明する 当てずっぽうではなく、使って測る
MySQLとWordPressにおけるインデックスの仕組み
インデックスは 目次各行をチェックする代わりに、MySQLは適切な範囲に直接ジャンプする。B-treeインデックスは、ソート、範囲フィルタ、JOINを非常に簡単に行うことができるため、WordPressのほとんどのケースをカバーします。 良い をサポートしています。ハッシュ・インデックスは正確な比較を高速化するが、検索でよく目にする範囲やLIKEクエリには適していない。フルテキストインデックスは単語をインデックスし、post_contentのような長いテキストフィールドのキーワード検索を大幅にスピードアップします。意味のあるインデックスがなければ、複雑なクエリはすべてフルテーブルスキャンで終わってしまう。 待ち時間.
WordPressのインデックスが本当に役立つとき
私は、クエリが選択的に定期的に実行されるようなインデックスを設定している。 ID, Eメール、スラッグ、post_date。wp_postsでは、post_author、post_date、post_statusに対するインデックスが効果的です。これらのカラムはWHEREやORDER BYによく登場するからです。wp_postmetaでは、meta_keyとオプションで(meta_key, meta_value)に対するインデックスが、テーマやプラグインが多くのカスタムフィールドをクエリする場合に大きなジャンプを提供します。wp_postsとwp_postmeta間のJOINは、両方のページが一致するキーを持つとすぐに顕著な恩恵を受ける。また、大きなテーブル、レポート、アーカイブ、カテゴリページでは、クエリが数百万行に渡ってではなくインデックスから読み込まれる場合に恩恵を受ける。 マスト.
インデックスがほとんど役に立たず、害にさえなる場合
インデックスを1つ追加するごとに メモリ となり、MySQL も構造を維持する必要があるため、挿入、更新、削除が遅くなります。書き込みの多いテーブルでは、個々の読み取りが高速であっても、全体の実行時間が大幅に増加する可能性があります。選択性の低いカラム、例えばブール値フィールドや少数のカテゴリーなどは、オプティマイザにフィルタリング能力をほとんど与えない。私は、インデックスをチェックするオーバーヘッドが利点を上回るため、非常に小さなテーブルを直接検索することを好む。典型的な誤操作と対策は、以下のガイドにまとめてある。 MySQLインデックストラップ をチェックする必要がある。 使用.
実践:測定から変革へ
私は測定から始める。 直感WordPressバックエンドのクエリモニタは、遅いクエリ、パラメータ、呼び出し元を表示してくれる。EXPLAINは、MySQLがインデックスを使っているのか、ALLでテーブル全体をスキャンしているのかを教えてくれる。このデータに基づいて、WHERE、JOIN、ORDER BYのカラム専用のインデックスを作成します。各変更の後、再度測定し、変更履歴を記録することで、悪影響を素早く取り除くことができる。待ち時間が主にクエリ設計に起因する場合は、次のように設定します。 ハードウェアの代わりにクエリーデザイン, なぜなら、より強力なサーバーは隠すだけだからだ。 原因.
WordPressテーブルのターゲットインデックス作成:概要と例
wp_postsでは、アーカイブ、著者、ステータスに関するクエリを 投稿日, post_author、post_status、必要に応じてこれらの組み合わせ。wp_postmetaでは、キーと値のどちらを頻繁にフィルタリングするかによって、meta_keyと必要に応じて(post_id, meta_key)または(meta_key, meta_value)を設定する。wp_commentsでは、comment_post_IDに対するインデックスが、投稿ごとのコメント一覧を高速化するために機能する。wp_usersでは、user_emailとuser_loginのインデックスが、ログインや管理者検索のための迅速なアクセスを提供します。そして、タクソノミー・テーブルでは、カテゴリー、タグ、商品属性に対するクエリが可能な限り高速になるように、JOINパスに注意を払っている。 直に 仕事だ。
| WPテーブル/フィールド | 代表的なフィルター | インデックス推薦 | ベネフィット | リスク |
|---|---|---|---|---|
| wp_posts (post_date, post_status) | アーカイブ、ステータスリスト | INDEX(post_status, post_date) | 迅速なソートと範囲 | より多くのライティング・オーバーヘッド |
| wp_posts (post_author) | 著者ページ | INDEX(投稿著者) | 高速フィルタリング | 小規模サイトでは低収益 |
| wp_postmeta (meta_key, meta_value) | カスタムフィールド | 必要に応じてINDEX(meta_key) (meta_key, meta_value) | 大幅な加速 | より大きなストレージ要件 |
| wp_comments (comment_post_ID) | 投稿ごとのコメント | INDEX(コメント投稿ID) | クイックアロケーション | 高い更新コスト |
| wp_users (user_email, user_login) | ログイン、管理者検索 | UNIQUE(user_email)、INDEX(user_login) | 完全一致 | バルク輸入にかかる費用 |
長い文字列にはプレフィックス・インデックスも使う。 メタキー(20)を使用することで、必要なスペースとキャッシュ・フットプリントを制限している。マルチカラムインデックスは、左側の接頭辞が使用されるように、クエリのフィルタ順序に従って整列させる。中容量のテキスト検索では、post_contentにフルテキストインデックスを使用することで、レスポンスタイムが大幅に短縮されます。先頭のプレースホルダ(c)があるLIKE検索では、古典的なインデックスでは対応できないので、このあたりで計画を立てる。そして、テーブルを変更する前に、データベースをバックアップし、変更を ステージング-環境。.
測定と制御:EXPLAIN、SHOW INDEX、ログ
EXPLAINを使えば、クエリが以下の条件を満たしているかどうかが一目瞭然です。 インデックス type=refまたはrangeが良く、ALLはテーブルスキャンを指す。SHOW INDEX FROMテーブルは、既存のインデックス、カーディナリティ、重複を明らかにします。my.cnfにslow_query_logを積極的に書き、実行時間の長いクエリを収集し、特別に処理するようにしています。変更後は、OPTIMIZE TABLEを使って統計とフラグメンテーションを更新します。そして、変更内容をコメントと日付で直接 SQL-スクリプトを使えば、後で再現できる。.
WooCommerce、wp_postmetaと全文:実践的な最適化
多くの商品を扱う店は、多くの悩みを抱えている。 ジョインズ プロパティとフィルターはwp_postmetaに配置されているからです。(post_id、meta_key)のインデックスは、商品ページ、フィルター、APIコールを大幅に高速化します。カテゴリーページでは、インデックスとキャッシュの組み合わせが重要で、繰り返し表示されるリストが常にデータベースに負担をかけないようにする。商品検索では、タイトルとコンテンツに関するフルテキストインデックスが有効で、私はまずストップワード、最小単語の長さ、関連性をテストする。フィルターがmeta_valueに大きく依存する場合は、データ構造を調べたり、繰り返される値を正規化されたテーブルに保存し、明確な 鍵 より。
wp_optionsのクリーンアップ:オートロードとトランジエント
wp_optionsテーブルはしばしば ボトルネック, autoloadのエントリが制御不能なほど増えたとき。私は、autoload=yesを必要最小限に抑え、古いトランジェントを削除することで、WordPressが起動時に読み込むメモリを減らしている。インデックスを追加することは、一貫したデータのメンテナンスと賢明なキャッシュに比べれば、あまり役に立ちません。構造化された導入のために、私は次のガイドを使います。 wp_optionsの最適化 そして定期的にボリュームをチェックする。必要であれば、めったに使わないオプションは別のテーブルに移動させたり、計画的に減らしていく。 清掃作業.
複数列、プレフィックス、「カバーリング」インデックスを正しく選択する。
私は、マルチ・カラム・インデックスのカラム・シーケンスを、実際のカラム・インデックスに従って選択する。 フィルタリング をWHEREで指定する。選択的検索が効果を発揮するためには、インデックスの先頭部分に最も強い制限がなければならない。ソートについては、ソートする列がインデックスの適切な位置にあるかどうか、また、その方向が適合しているかどうかによって効果が異なります。クエリに必要な全てのカラムを含むカバレッジインデックスは、追加のテーブルアクセスを回避し、待ち時間を顕著に短縮する。また、可変文字列のプレフィックスインデックスを使用することで、メモリを削減し、バッファプールを小さく保つことができます。 効率的.
アーキテクチャの問題:キャッシュ、プーリング、サーバー設定
インデックスが最もうまく機能するのは、次のように組み合わせたときだ。 対象-キャッシュ (Redis など) を使用することで、クエリの繰り返しを避けることができます。持続的な接続処理とクリーンなプーリング設定により、PHPワーカーのセットアップ時間を短縮します。innodb_buffer_pool_sizeなどのInnoDBパラメータを最適化し、頻繁に使用されるインデックスやデータページがメモリに保存されるようにしています。同様に重要なのは、リクエストあたりのオーバーヘッドを抑えられるように、たくさんの小さなクエリではなく、少数のよく設計されたクエリを使うことです。ハードウェアをアップグレードする前に、クエリプラン、インデックスカバレッジ、アプリケーションロジックをチェックします。 レバー を提供する。.
WPの一般的なクエリーパターンを正しくインデックス化する
WordPressの典型的なクエリは、繰り返されるパターンに従っている。私は一貫してチェックしています:
- 範囲の前に等しいWHEREの組み合わせ:インデックスでは、以下のようにカラムを並べる。 =-条件 間, >, < またはLIKE ‚abc%‘。これは検索空間を小さく保ち、オプティマイザはインデックス内の範囲列 „from to “に対して実行することができます。.
- インデックスを使用した ORDER BY をカバーする: クエリが特定の post_status に対して post_date DESC でソートする場合、(post_status, post_date DESC) のような複合インデックスを使用します。最近の MySQL のバージョンでは 下降 インデックスカラムを使用することをFilesortは避けています。.
- JOINパスを最小限にする:wp_posts → wp_postmeta を post_id で JOIN する場合、(post_id, meta_key) は特定のキーの検索をかなり高速化します。反対側」では、wp_postsでフィルタリングされたカラム(例えばpost_status)に対するインデックスが、両方のステップを選択的にするのに役立ちます。.
- 大量の場合はINの代わりにEXISTSを使用する:サブクエリが多くの値を提供する場合、セマンティックに同一のEXISTSバリアントはしばしばより有利であり、より良いインデックス利用を可能にします。.
最新のインデックス・チューニングのためのMySQL機能
現在のMySQL/MariaDBのバージョンには、私が特に使用している関数が用意されている:
- EXPLAIN ANALYZE はプランステップごとの実際のランタイムを示しています。プランが適合しているのか、統計がオプティマイザを惑わせるのかがわかります。.
- 目に見えない指標 テストに使っています:インデックスを一時的に不可視にして、クエリが遅くなるかどうかを観察します。これにより、バラストを安全に取り除くことができます。.
- 機能/生成コラムLOWER(email)を比較するクエリでは、正規化された表現で生成されたカラムを作成し、インデックスを作成します。こうすることで、WHEREに関数があってもインデックスを使用できるようになります。.
- ヒストグラムと統計非常に不均衡な分布の場合、オプティマイザーが選択性を現実的に推定できるように統計量を更新する。.
ダウンタイムなしの変更:安全なデプロイとロールバック
私は、サイトがオンラインを維持できるようにインデックスの変更を計画します。負荷の低い移行ウィンドウを使用し、オンライン対応のALTERバリアントに依存し、その間の待ち時間とロック待ち時間を監視します。追加のインデックスがバッファプールを圧迫しないように、事前に必要なメモリを測定しておきます。きれいなロールバックのために、DROP/CREATEスクリプトとそれぞれのコメントを日付とともに手元に置いておき、すぐに次のことができるようにしておく。 引き取る 缶。
WooCommerceを具体的に: HPOS、ルックアップ、フィルター
最新のWooCommerceセットアップでは オーダーテーブルとルックアップテーブル が大きな役割を果たしています。私は、ステータスや日付による注文概要のクエリに適切なインデックスを持たせ、管理者リストやレポートが素早く開くようにしています。属性、価格、在庫レベルに基づく商品フィルターは、特定のキーを持つルックアップテーブルが役立ちます。フィルターがmeta_valueに負担をかける場合、コンセプトの変更が役に立ちます。頻繁に使用される属性を正規化するか、ルックアップテーブルで実体化することで、wp_postmetaの負担を軽減します。.
マルチサイトと大規模インストール
マルチサイト環境では、WordPressはサイトごとにテーブルを分けてスケーリングします。これにより、個々のテーブルを小さく保つことができます。 選択性 とキャッシュ・ヒット。私は、準備された集計のないグローバルなクロスサイトレポートは避けている。多くのサイトを要約する必要がある場合は、定期的に集計テーブルを満たし、クエリーパスのインデックスをターゲットにして作業する。.
文字セット、照合順序、インデックス長
と一緒に utf8mb4 インデックス・キーの幅は大きくなる。インデックスあたりの3072バイト制限が障害にならないように、プレフィックス・インデックス(例えば(meta_key(20)))を意図的に計画している。大文字小文字を区別しない検索では、適切な照合順序を選択する。それでも正規化(LOWER/UPPER)を正確に比較したい場合は、WHEREで関数の代わりに生成カラムを使用する。長いテキストフィールドの場合、やみくもにインデックスを作成することはありません。高いカーディナリティを達成するためにどれくらいの接頭辞があれば十分かを測定し、それに応じて接頭辞を選択します。.
インデックスを上書きするアンチパターン
パターンによっては、多くの時間を費やし、インデックスの活用を妨げるものもある:
- インデックス列に対する関数 のWHERE(例えばDATE(post_date))で、既存のインデックスが使用されないようにしています。その代わりに、範囲(post_date >= ... AND post_date < ...)を使ってフィルタリングします。.
- リードするワイルドカード LIKE(‚c‘)はインデックス可能ではありません。現在、再計画中です(プレフィックス検索、フルテキスト、その他のデータ構造)。.
- インデックスが多すぎる 同じ列、または同じ左接頭辞は、ほとんど役に立たないが、執筆コストを増加させる。私は重複を統合する。.
- ORDER BY インデックスに表示されないカラムに対するソートは、ファイルソートにつながる。ソートがビジネスクリティカルな場合は、適切な複合インデックスを作成する。.
インデックスの衛生管理:重複を減らし、的を絞った方法で保持する。
SHOW INDEXを使用して、複合インデックス(post_status, post_date)の隣にあるpost_statusの単一インデックスのような冗長な構造を見つけます。複合インデックスが左の接頭辞をカバーしているため、多くの場合、単一インデックスを削除することができます。同時に、見た目は似ているが異なるクエリパスを提供するインデックス(例えば、(post_author)と(post_status, post_date))も残しています。テーマやプラグインのアップデートで後で驚かないように、インデックスが残ったり減ったりする理由を意図的に文書化しています。.
キャパシティプランニング:バッファプール、I/O、インデックスのフットプリント
インデックスが加速されるのは、次のような場合だけです。 バッファプール 嘘です。よく使うインデックスとデータのサイズがメモリに収まるようにしている。データ量が増えたら、まずどのインデックスが本当に重要かをチェックし、接頭辞の長さを短くし、めったに使わない組み合わせを削除する。作業負荷がクリーンになって初めて、より多くのRAMを使う価値がある。書き込み負荷が高い場合は、インデックスのメンテナンスによる追加I/Oに注意を払い、過剰な「完全網羅的」インデックス作成は避ける。.
高度な測定と制御
EXPLAINに加え、私は実運用での測定に頼っています。現実的な閾値を持つslow_query_logは異常値を示し、最も頻度の高いクエリのパターン分析は傾向を可視化します。インデックス変更後、SHOW INDEXでカーディナリティをチェックし、影響を受ける行数(rows_examined)を分析し、キャッシュのヒット率とレイテンシを観察します。新機能やプラグイン、トラフィックのピークによって使用プロファイルが変化するため、定期的にこのサイクルを繰り返します。.
概要
をセットした。 データベースのインデックス 選択クエリや繰り返しクエリが実行されるところでは、それらを除外し、書き込みが支配的なところでは、それらを除外する。WordPressでは、wp_posts、wp_postmeta、wp_comments、wp_usersが、実際のフィルタをカバーするときに最大の利益をもたらす。EXPLAIN、Query Monitor、slow_query_logによる計測は、確実に正しい候補を導いてくれる。wp_optionsのメンテナンス、キャッシュ、そして優れたクエリ設計は、インデックスが原因を解決する代わりに症状を覆い隠すことを防ぎます。これにより、データベースは高速に保たれ、書き込み負荷は制限内に収まる。 パフォーマンス 安定 - ブラインド・インデックスなし.


