2000件以上の商品登録で、動作が重くなるのを解消する

EC-CUBEでは、2000件以上商品登録をすると、異常に動作が重くなります。
コミュニティサイトを見ていると、mysqlがサブクエリを連発するからだということです。
postgreSQLなら、問題ないのだけど・・・・・・とあったので、postgreSQLをインストールしてみたけど、うまくインストールできない。(ちょっと不親切です・・・・・・ラ●●●●●ト)

今回、自分的に結構改造していて、商品一覧は以下のようにしてしまいました。

・そこに所属しているカテゴリーの商品だけ表示(レベルとか関係ない)
・規格は使わない

で、EC-CUBEが発行しているクエリ文を見ていると、特にそんなサブクエリなしでINNER JOINで3つテーブルくっつければいけそうな気がしたので、そう改造しました。

しかし、そう改造すると、本当に改造しまくっちゃったので、LC_Page_Products_List.phpがバージョンアップで何かコードが変わったときに、だいぶ苦労するだろうなぁ・・・・・・と思います。
ので、これはあんまり参考にしないほうがよいです。

普通は、表示されているのが親カテゴリの場合、その子孫カテゴリの商品もひっぱってくる使用だから、また、規格をつかうから、あのサブクエリが必要になってくるっぽいので、そういう仕様じゃなければ、まったく関係ない話だと思います。

ちょっとこれを期にpostgreSQLを勉強しよう・・・・・・。

とりあえず、むちゃくちゃな改造はここ以降で説明します。

まずは、
L423ぐらいの(結構改造しちゃってわからないんですよね)

—————————————————————————

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ default:
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $col = “DISTINCT T1.product_id, product_code_min, product_code_max,”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” price01_min, price01_max, price02_min, price02_max,”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” stock_min, stock_max, stock_unlimited_min,”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” stock_unlimited_max, del_flg, status, name, comment1,”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” comment2, comment3, main_list_comment, main_image,”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” main_list_image, product_flag, deliv_date_id, sale_limit,”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” point_rate, sale_unlimited, create_date, deliv_fee, ”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” T4.product_rank, T4.category_rank”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $from = “vw_products_allclass AS T1″
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” JOIN (”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” SELECT max(T3.rank) AS category_rank,”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . “ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ max(T2.rank) AS product_rank,”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . “ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ T2.product_id”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . “ツꀀツꀀ FROM dtb_product_categories T2”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . “ツꀀツꀀ JOIN dtb_category T3 USING (category_id)”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . ” GROUP BY product_id) AS T4 USING (product_id)”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $order = “T4.category_rank DESC, T4.product_rank DESC”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ break;

—————————————————————————

—————————————————————————

ツꀀツꀀツꀀツꀀツꀀ default:
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $col = “*”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $from = “(dtb_products INNER JOIN dtb_product_categories ON dtb_products.product_id = dtb_product_categories.product_id) “;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $from .= “INNER JOIN dtb_products_class ON dtb_products.product_id = dtb_products_class .product_id “;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $order = “dtb_products.product_id ASC”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ break;

—————————————————————————-

にし、

L445あたりの

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $where = “del_flg = 0 AND status = 1 “;

を、

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $where = “dtb_products.del_flg = 0 AND dtb_products.status = 1 “;

にします。

L481あたりからの

—————————————————————————-

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $linemax = count($objQuery->getAll(“SELECT DISTINCT product_id ”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . “FROM vw_products_allclass AS allcls ”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . (!empty($where) ? ” WHERE ” . $where
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ : “”), $arrval));
——————————————————————————

——————————————————————————-

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $linemax = count($objQuery->getAll(“SELECT dtb_products.product_id ”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . “FROM (dtb_products INNER JOIN dtb_product_categories ON dtb_products.product_id = dtb_product_categories.product_id) ”
ツꀀツꀀツꀀ ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . “INNER JOIN dtb_products_class ON dtb_products.product_id = dtb_products_class.product_id ”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . (!empty($where) ? ” WHERE ” . $where
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ : “”), $arrval));

——————————————————————————-

へ。

これでひとまず、一覧は表示されるようになると思います。

検索結果や新着順・価格順も変更する必要がありますが、それはまた後日説明を加えます。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です