Magentoを1系から使っている方にとっては、悩ましい問題の一つである「インデックス」。
データがおかしくなったり、インデックス更新が終わらなかったりすることも度々でした。

Magento2系になり、インデックスは大きく変更され、Open Source版でもCommerce版と同じ機能が利用できるようになりました。
そして、2.2.6以降では新たにインデックス更新処理を一部並列化できる機能が追加され、パフォーマンスが向上しています。

おさらい:Magento2のインデックスモード

新機能の解説に入る前に、Magento2のインデックスモードについておさらいしておきましょう。
Magento2系のインデックスは2つのモードがあり、商品点数や諸々のデータ件数に合わせて使い分けできるようになっています。

Update on Save

インストールした直後の状態のインデックスは全てこのモードになっています。
インデックス対象のデータに更新(新規作成・変更・削除)が起きたら、即時にインデックスを更新するというモードです。

データ量や更新頻度が少ないサイトの場合はこちらのモードのほうが適しています。
ただし、そういったサイトであっても大量にデータを更新するような状況では1件のデータ更新ごとにインデックスが更新されるので、膨大な処理不可が発生する恐れがあります。
カテゴリと商品の関連付けや、在庫の一括更新などを行う場合は注意したほうが良いでしょう。

Schedule Update

「Schedule Update」は、Magentoに用意されているコマンドラインツールでインデックスの動作モードを明示的に切り替えることで利用可能になります。
主にデータ更新頻度が高いサイトや、データ量が多いサイト向けのモードで、処理負荷を一定に抑えたい場合に使用します。

このモードにインデックスを切り替えると、対象のデータが更新された際に、インデックスは直ちに更新されなくなります。
代わりに、変更履歴が専用のテーブルに記録されるようになり、毎分実行するインデックス更新用の処理によって、一定件数ずつ更新されていきます。

2.2.6で導入されたDimensions Mode

さて、2つのモードがあるMagento2のインデックスですが、やはりデータ量が多くなるとパフォーマンス問題が顕在化します。
Magentoが持っているマルチサイト機能や、顧客グループ機能を使用すると、商品データや価格データなどが肥大化しやすく、インデックス更新に時間がかかるようになります。

2.2.6で導入された、Dimensions Modeではインデックス更新処理範囲を分割し、並列化することで処理効率をあげられるようになっています。

対象となるインデックス

Dimensions Modeが利用できるのは以下のインデックスです。

  • Product Price

実はDimensions Modeが利用できるのは商品価格インデックスだけなのですが、検索インデックスやカテゴリ商品関連インデックスも2.2.6以降はストアビュー単位での並列処理ができるようになっています。

利用できるDimensions Mode

現時点で利用できるDimensions Modeは以下のとおりです。

  • なし(none)
  • ウェブサイト(website)
  • 顧客グループ(customer_group)
  • ウェブサイトと顧客グループ(website_and_customer_group)

下記のようなコマンドを実行することで、Dimensions Modeを切り替えられます。

php bin/magento indexer:set-dimensions-mode catalog_product_price website

また、app/etc/env.phpに「MAGE_INDEXER_THREADS_COUNT」という設定値を追加することで、同時に実行するインデックス更新処理の数を変更できるようになっています。

2.2.5以前との性能比較

Magento公式のDevBlogでも取り上げられていますが、下図のような変化がDimensions Modeを利用することで得られます。

インデックス性能比較

メリットが得られやすい環境

Dimensions Modeの導入でメリットが得られやすいのは、以下のような環境です。

  1. 複数の顧客グループを活用した商品の販売を行っている
  2. マルチサイト運用で、ウェブサイト数が多い環境
  3. 1と2を組み合わせている環境

シングルサイト運用で、商品点数が多く、顧客グループ別の価格設定をしていない場合にはあまりメリットは得られないかもしれません。
とはいえ、Magento2のインデックス更新処理は、Magento1にくらべるとずっと速いので、100万件のインデックス更新であっても以前の数分の1の時間で処理できます。