こんにちは!
Nishiです。前回は Magentoの商品を登録する方法 についての記事を書きました。
今回は、前回の記事で少し触れた、Magentoの「インデックス(Indexer)」の仕組みについて書いていきたいと思います。
※本記事は、Magento Open Source 2.4.7-p3 を使用しています。
インデックスとは?
Magentoのインデックスとは、
表示・検索・価格計算・在庫確認などを高速化するための仕組みです。
Magentoでは、商品やカテゴリなどのデータは複雑な構造(EAV)で保存されています。
そのため、そのままの状態で毎回データを取得すると、処理が重くなってしまいます。
そこでMagentoでは、用途ごとに最適化されたデータ(インデックス)を事前に生成しています。
例えば、以下のような用途でインデックスが利用されています。
- catalogsearch_fulltext → 商品検索用
- catalog_product_price → 価格インデックス(ルール/税/通貨などを反映した計算済み価格データ)
- cataloginventory_stock → 在庫状態の判定
- catalog_category_product → カテゴリと商品の紐づけ
このように、インデックスは単に表示を高速化するだけでなく、
検索・価格・在庫など、ECサイトの重要な機能を支える役割を持っています。
また、特に catalogsearch_fulltext は他のインデックスと異なり、検索処理に特化したインデックスです。
他のインデックスがDB内の専用テーブルで管理されるのに対し、catalogsearch_fulltext は検索エンジン(OpenSearch)上に構築され、商品検索機能を支えています。
このため、商品情報の全文検索などは、このインデックスを通じて実行されます。
インデックスの仕組み
Magentoのデータ反映は、以下のような流れになっています。
- 管理画面で商品やカテゴリを登録・更新
- インデックスが更新される(または更新対象として処理される)
※設定によっては即時ではなく、後から更新される場合があります。 - フロントエンドに反映される
この仕組みにより、フロントエンドでは高速にデータを表示することができます。
インデックスの更新モード
インデックスには、2つの更新モードがあります。
逐次更新(Update on Save)
商品やカテゴリを保存したタイミングで、リアルタイムにインデックスが更新されます。
特徴
・保存処理と同時にインデックスが更新される
・フロント画面へ即時反映される
・cronに依存せず動作する
メリット
・変更内容がすぐにフロントエンドへ反映される
・cron設定の影響を受けない
デメリット
・商品数や属性が多い環境では、保存時の処理が重くなる
・大量データ更新(インポートなど)には不向き
スケジュールで更新(Update by Schedule)
cronによって定期的にインデックスが更新されます。
特徴
・商品やカテゴリの更新時に、変更内容が内部の変更履歴(changelog)に記録される
・cron実行時に、その差分をもとにインデックスが更新される
・標準設定では1分間隔でcronが実行され、そのタイミングで更新処理が行われる
メリット
・保存時の処理が軽く、管理画面の操作が快適
・大量データ更新やバッチ処理に適している
デメリット
・反映までにタイムラグ(数秒〜数分)が発生する
・cronが正常に動作していない場合、反映されないことがある
インデックスの状態確認
以下のコマンドで、インデックスの状態を確認できます。
bin/magento indexer:status
ステータスは主に以下の3種類です。
- Ready:最新の状態(内部的には「valid」)
- Reindex required:更新が必要(内部的には「invalid」)
- Processing:現在インデックス処理中(内部的には「working」)
管理画面で確認する方法
インデックスの状態は、管理画面からも確認することができます。
システム > ツール > インデックス管理 から、各インデックスの状態や更新モード(保存時 / スケジュール)を確認できます。
また、この画面から更新モードの変更を行うことも可能です。
すぐに反映させたい場合
すぐにフロント画面へ反映させたい場合は、以下のコマンドで手動更新が可能です。
bin/magento indexer:reindex
特定のインデックスのみ更新することも可能です。
インデックス名を指定することで、対象を絞ることができます。
また、複数のインデックスを同時に更新する場合は、スペース区切りで指定できます。
bin/magento indexer:reindex catalog_product_price catalogsearch_fulltext
このとき、catalog_product_price はデータベース内の専用テーブルが更新され、catalogsearch_fulltext は検索エンジン(OpenSearch)上のインデックスが再構築されます。
また、OpenSearch側のインデックスに不整合や破損が発生した場合でも、catalogsearch_fulltext を再インデックスすることで検索インデックスを再構築できます。
これにより、検索機能の復旧が可能になります。
cronとの関係
「スケジュールで更新(Update by Schedule)」に設定されている場合、インデックスの更新はcronによって実行されます。
以下のコマンドでcronを手動実行することも可能です。
bin/magento cron:run
※このコマンドはインデックス以外のcronジョブも同時に実行されます。
cronが正しく動作していない場合、インデックスが更新されず、フロント画面に反映されないことがあります。
インデックス関連のテーブル
インデックスの状態は、主に以下のテーブルで管理されています。
indexer_state
各インデックスのステータス(valid / invalid / working)や更新モード(save / schedule)を管理
mview_state
スケジュール更新の進行状況を管理(どこまでインデックスが更新されたかを保持)
最後に
今回は、Magentoのインデックスについて解説しました。
インデックスは、商品やカテゴリ、検索、価格などの情報を高速に表示するための仕組みです。
インデックスが更新されていない場合、フロント画面に正しく反映されないことがあるため、状態の確認や更新方法を理解しておくことが重要です。
また、更新モードには「保存時」と「スケジュール」の2種類があり、用途に応じて使い分けることがポイントになります。

