Magentoの基礎概念 〜 10万点以上の商品でも管理可能

前回はMagentoの基礎概念のうち、多言語・多通貨・マルチサイトについて取り上げました。
今回はECサイトを構築する場合に気になる「商品点数」について紹介したいと思います。

Magentoはどれくらいの数の商品を管理できる?

「ウチのサイト、商品が8,000点くらいあって多いんですよ」

こういったお声をサイトオーナーの方からよくいただきます(件数はあくまで例です)。
確かに1万点前後の商品点数と言うのは、決して少ない数ではありません。自社製品を扱うECサイトでは多い部類に入るでしょうし、様々な商品を扱う小売店や問屋の場合は少ないかもしれません。

では、Magentoにとってはどうでしょうか?
正直なところ、Magentoの事例的には1万点程度だとさほど珍しくはありません。
10万点、いや100万点以上という事例もあるほどです。
弊社の事例でも5万点以上の商品点数をメモリ4GBのVPS1台で運用されている事例がありますが、最初の商品データ登録こそ大変だったものの、それ以降の運用に関してはさほど問題なく運用ができています。

商品点数が増えると起きてくる問題

とはいえどんなアプリケーションでもデータ量が増えてくると、読み込みや書き込みで性能の劣化が目につくようになります。
Magentoでもそれは避けられない問題です。おなじ性能のサーバーを使っていても、データ量が多いほうが性能が劣化します。

顧客情報や注文情報はじわじわと増えていくのですぐに性能劣化を感じにくいのですが、商品やカテゴリに関するデータ量はサイト構築時点である程度はっきりと性能が劣化していくことを感じられると思います。

もちろんこのような現象はMagentoも把握しているので、きちんとベストプラクティスが公表されています。

大量の商品点数を扱う場合のコツ

大量の商品点数(今回は仮に1万点以上としておきます)を扱う場合、Magentoが公表しているベストプラクティスが幾つかあります。

フラットテーブルを使う

フラットテーブルというのは、Magento1系から実装されている仕組みです。
Magentoの初期バージョンからずっと採用されているEAV(Entity-Attribute-Value)モデルは、データ量が増えると発行するSQLクエリの件数と複雑さが増大し、パフォーマンスが急速に悪化するという仕様上の問題を抱えています。
この問題に対処するため、MagentoではEAVによって管理されている商品データを別テーブルに書き出し、より少ないSQLクエリ件数とクエリ自体の単純化を行いました。
それがフラットテーブルです。

フラットテーブルを有効にするには

フラットテーブルはMagentoに標準で備わっている機能なので、有効化することはとても簡単です。
まず、管理画面にログインし、システム設定画面にアクセスします。

次に「カタログ」の「カタログ」に移動し、「ストア」の項目を選択すると、次のような画面が表示されます。

この中の「フラットカタログカテゴリを使用する」「フラットカタログ商品を使用する」を「Yes」にして設定を保存すると、フラットテーブルが有効になります。
設定を保存した直後は、インデックスが最新ではないので、次のように警告が表示されます。

インデックス管理画面で確認すると、いくつかのインデックスの再インデックスが必要であることがわかります。

Magento2では管理画面からインデックスを更新することはできないので、Cronジョブによる定時処理を待つか、コマンドラインからの手動再インデックス実行が必要です。

フラットテーブルを有効化する影響

フラットテーブルを有効にすると、主にフロントエンドでのデータベース負荷が軽減され、パフォーマンスが向上します。
反面、フラットテーブルを無効化していた場合とでは多少Magentoの挙動が変わることがあります。
一部のサードパーティ製エクステンションが動作不良を起こす可能性がありますので、フラットテーブルを有効化する前にはきちんと検証環境で動作チェックをすることをオススメします。

商品ページURLからカテゴリパスを除外する

ご存じない方が多いMagentoの仕様なのですが、Magentoでは商品ページのURLが複数パターン存在することがあります。
具体的にどういうことかと言うと、

  • http(s)://example.com/sample-product.html
  • http(s)://example.com/category1/category2/sample-product.html

というように、カテゴリパスのあるURLとカテゴリパスのないURLが1つの商品に対して作成されることがあります。
SEOの観点では上記のような同じ内容のページが異なるURLで存在することはあまり好ましくありません(Googleによって重複コンテンツとみなされます)。
もちろんCanonicalタグをつけていれば回避はできますが、できれば1つに統一したほうが良いでしょう。

なぜ、商品ページURLからカテゴリパスを除去しないといけないのか

Magentoには商品やカテゴリ、CMSページなどのURLを自動的に書き換える機能がついています。これらのデータには「URLキー」という項目があり、Magentoはこの値を使用してURLを生成するようになっています。

問題は、商品ページです。次の図を見てください。

この例では、1つの商品に対して作成されたURLのパターンを表示させています。
1つの商品に対してこの例では3つURLが作成されています。この例では1つの商品だけですが、これが数万点の商品と複数のウェブサイト・ストアビューになるとどうでしょう?
データは管理者の想定を遥かに超えて肥大化する可能性がありますね。
カテゴリパスを商品ページURLから除去する設定を有効にしてからMagentoでのサイト構築を開始すると、この問題は起きなくなり、データ件数の増加は緩やかになります。

カテゴリパスを商品ページURLから除去するには

まず、管理画面にログインし、システム設定画面にアクセスします。
次に「カタログ」の「カタログ」に移動し、「検索エンジン最適化」の項目を選択すると、次のような画面が表示されます。

この中の、

  • 商品URLにカテゴリパスを使用する

を「No」にすることで、商品URLにカテゴリパスがつかなくなり、データ件数の増加が止まります。
また、以下の2つの設定を有効にすることで、たとえURLにカテゴリパスがついていても、Googleから重複コンテンツとみなされなくなります。

  • カテゴリにCanonicalタグを使用する
  • 商品に正確なCanonicalタグを使用する

忘れがちな設定なので、サイト構築を始める際には有効にしておくことをオススメします。

URLキーをみだりに変えない

Magentoには商品やカテゴリページのURLが変更になると、古いURLから新しいURLに対してリダイレクトを設定する機能が備わっています。
標準設定ではこの機能は有効になっていて、URLキーを変更した場合に自動的に新しいURLにリダイレクトする設定がURL書換テーブルに作成されます。

この機能自体はとても便利な機能で、URLが変更になった際に404ページが出ることを防いでくれます。
問題は先程の「商品ページURLにカテゴリパスを使用する」状態になっていると、リダイレクト設定がURL書換テーブルの件数分作られてしまうということです。
さらに怖いのは、この仕組を知らずに何度もURLキーを変更してしまうことです。

変更のたびにデータが作られるので、気がつくと大した商品点数でもないのに、URL書換テーブルだけが異様に肥大化していることがあります。
できれば商品やカテゴリページの公開後はURLを変えないほうがよいでしょう。もし変更したくなった場合でも大規模に変更することは避けたほうが良いかもしれません。

まとめ

今回はMagentoで管理できる商品点数の上限について取り上げました。
システム的な制限は基本的にはありません。ですが以下のことにサイト構築時から注意をしておく必要があります。

  • フラットテーブルを有効にしておくこと
  • 商品ページURLからカテゴリパスを除去しておくこと
  • URLをみだりに変えないこと

また、サーバー性能も適切なものを選んでおく必要があります。
Magentoがいくら頑張って処理をしようとしても、CPUやメモリの性能が不足していると、快適な性能が得られません。

Magentoでサイトを構築する場合には、注文件数やアクセス数だけでなく、商品点数もサーバー性能を選択する要素として加えるようにして下さい。