EC-CUBEのカスタマイズ、ネットショップ制作メモ

主にEC-CUBEを利用したネットショップの制作、カスタマイズや独自機能の開発について

EC-CUBE 2.11系で変わった事 -商品一覧の取得方法-

EC-CUBEも2.11.1がリリースされましたね。
遅ればせながら2.4系から2.11系*1で変わったところをご紹介していきたいと思います。
今回は遅いクソだと言われ続けていた商品一覧の表示処理の部分についてです。

2.4系からEC-CUBEをいじってる方はまずココで「アレ?」ってなるのではないでしょうか?

1回の表示でSQLを2回発行する様になった

EC-CUBEの商品情報は主に、メインの商品情報と、「規格」と呼ばれるサイズや色違いの商品情報を取得している商品から構成されています。
そこにカテゴリ情報なんかが結合されて商品一覧を表示しているのですが、MySQLではサブクエリからのSELECTでインデックスが利用されないなど、複数のテーブルを複雑に結合している為にパフォーマンスはかなり犠牲にされていました。
特にMySQLで動かした場合は規格を増やすと最悪サイトが止まるレベルの重さでした。

コアの開発者の大河内さんはこの部分にも非常に心を痛めており、「次のバージョンでは絶対に改善させる!」と考えていた様です。

2.11.0で新しく追加されたSC_Product

EC-CUBEの2.11では2.4系には無かったSC_Productというクラスが新たに追加されました。
MVCで言うと「Productモデル」の様な物で、商品の表示関連の処理はここに書かれています。

2.11系ではデータベースでviewを使わない様に変更されています。
なので商品一覧を取得する際は、まず検索条件とソート順で表示する分だけの商品IDを取得し、その後でその商品IDから一覧で表示する情報を取得する様になっています。*2

僕も最初見た時は
「何で2回に分けてるんだ?」
と思いましたが、理由を聞いたところこの方法がPostgreSQLMySQL共に一番早かった様です。

なので、もし商品一覧で表示する項目や並び順をカスタマイズされたいのであれば、一度このクラスの動きを追っておく事をオススメします。

*1:何で2.4から2.11?2.5は?と思うかも知れません、当初は2.5だったんですが、「いっぱい変わったし2011年だし!」という関西ノリで2.11になりました。

*2:他にもページング用の全体件数を取得したりもしています。