バージョン選択

フォーラム

メニュー

オンライン状況

66 人のユーザが現在オンラインです。 (46 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 66
もっと...

サイト内検索

質問 > フロント機能 > カテゴリー数が多いと商品一覧が遅い

フロント機能

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
h_tanaka
投稿日時: 2018/5/8 17:27
対応状況: 解決済
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
カテゴリー数が多いと商品一覧が遅い
EC-CUBE3.0.16

現在、カテゴリーが4階層で、カテゴリー数が3209件登録されています。

この状態で次のように上位のカテゴリーを指定して商品一覧を表示すると、ページが表示されるまでに40秒ほどかかってしまいます。
https://example.com/products/list?category_id=2

デバッグモードで確認したところ、カテゴリーの取得クエリが約1000回も実行されていました。

ソースコードをデバッグして各ステップの処理時間を計測したところ、
src/Eccube/Controller/ProductController.php
の paginate() で40秒ほどかかっていました。

おそらく、
src/Eccube/Repository/ProductRepository.php
の getQueryBuilderBySearchData() において、
$Categories = $searchData['category_id']->getSelfAndDescendants();

の箇所で再帰的にカテゴリーを取得しているためと思われます。

src/Eccube/Entity/Category.php
    public function getDescendants()
    {
        $DescendantCategories = array();

        $max = 10;
        $ChildCategories = $this->getChildren();
        foreach ($ChildCategories as $ChildCategory) {
            $DescendantCategories[$ChildCategory->getId()] = $ChildCategory;
            $DescendantCategories2 = $ChildCategory->getDescendants();    // ★ ここで再帰的に子カテゴリーを取得している
            foreach ($DescendantCategories2 as $DescendantCategory) {
                $DescendantCategories[$DescendantCategory->getId()] = $DescendantCategory;
            }
        }

        return $DescendantCategories;
    }

    public function getSelfAndDescendants()
    {
        return array_merge(array($this), $this->getDescendants());
    }


この箇所のパフォーマンスを改善したいのですが、解決方法わかりますでしょうか?


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

468
投稿日時: 2018/5/8 17:43
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: カテゴリー数が多いと商品一覧が遅い
それだけのカテゴリー件数を登録した事が無かったので、初めてこの処理に気付きましたが、
src/Eccube/Repository/ProductRepository.phpの getQueryBuilderBySearchData()にて、
指定したカテゴリの子カテゴリを取得してDQLに渡す必要が無いのではないかと思います。

$Categories = $searchData['category_id']->getSelfAndDescendants();
の記述を
$Categories = array($searchData['category_id']);
で同じ検索結果を得られるのではないでしょうか?

どのバージョンからかはっきりと思い出せないのですが、
商品編集画面でカテゴリを紐づけた時に、親カテゴリも全てdtb_product_categoryテーブルに保存するようになっていたと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

h_tanaka
投稿日時: 2018/5/8 17:48
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: カテゴリー数が多いと商品一覧が遅い
468様

ご提示の方法で試してみたところ、商品情報が1件も取得できなかったです。。

SELECT count(DISTINCT d0_.product_id) AS sclr0 FROM dtb_product d0_ INNER JOIN dtb_product_category d1_ ON d0_.product_id = d1_.product_id INNER JOIN dtb_category d2_ ON d1_.category_id = d2_.category_id AND (d2_.del_flg = 0) INNER JOIN dtb_product_class d3_ ON d0_.product_id = d3_.product_id AND (d3_.del_flg = 0) WHERE (d0_.status = 1 AND d1_.category_id IN (2)) AND (d0_.del_flg = 0) GROUP BY d0_.product_id, d0_.product_control_number, d0_.name, d0_.note, d0_.description_list, d0_.description_detail, d0_.search_word, d0_.free_area, d0_.no_cash_on_delivery, d0_.del_flg, d0_.create_date, d0_.update_date, d0_.creator_id, d0_.status


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

nanasess
投稿日時: 2018/5/8 18:04
対応状況: −−−
登録日: 2006/9/9
居住地:
投稿: 2303
Re: カテゴリー数が多いと商品一覧が遅い
PostgreSQL でしたら、再帰クエリが使用できますので、 ORM を使用せずに再帰クエリを使用するようにカスタマイズするのがおすすめです。

MySQL の場合は MySQL8 から再帰クエリが使用できますが、それ以前のバージョンでは、かなり辛いと思います。
(MPTT というアプローチがありますが、難易度高いです。。。 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ )
h_tanaka
投稿日時: 2018/5/8 18:06
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: カテゴリー数が多いと商品一覧が遅い
nanasess 様

MySQL 5.6.37 ですね・・。
SQL発行回数を極力少なくして再帰的に子カテゴリーを取得する方法を検討してみます。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

468
投稿日時: 2018/5/8 20:10
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: カテゴリー数が多いと商品一覧が遅い
インストール直後の状態で、
管理側にて、パーコレータの編集画面を表示してカテゴリにフォークを選択して登録後、
フロント側で「キッチンツール」「食器」で検索してパーコレータが表示されるのを確認していました。

商品データを一括登録されている場合などは、
親カテゴリの情報がdtb_product_categoryに登録されていないのかもしれませんね。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

h_tanaka
投稿日時: 2018/5/9 9:31
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: カテゴリー数が多いと商品一覧が遅い
468 様

確かに、パンくずリストを簡略化するために、商品登録および商品CSV登録における親カテゴリーの自動登録処理をコメントアウトしておりました。

商品と親カテゴリーが紐づいているのでしたら先のご提案の方法が有効そうですね。
試してみます。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

h_tanaka
投稿日時: 2018/5/10 17:45
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: カテゴリー数が多いと商品一覧が遅い
468 様

ご提案の方法でうまく動作しました。
ありがとうございました!


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

468
投稿日時: 2018/5/11 8:14
対応状況: −−−
登録日: 2008/10/26
居住地:
投稿: 3217
Re: カテゴリー数が多いと商品一覧が遅い
ご連絡ありがとうございます。
無事動作したという事で安心しました。

3.0.12か3.0.13ぐらいのバージョンで商品登録時に親カテゴリを記録するように仕様変更されていましたので、
商品検索処理において、親→子カテゴリを走査する処理は無くなったと思っていましたが、残っていたのですね。

弊社でもカテゴリが多いサイトでは、該当処理を改修しておきたいと思います。


----------------
株式会社シロハチ
■ECCUBE2系、3系構築カスタマイズご相談ください。
EC-CUBE3マニュアル
blog

h_tanaka
投稿日時: 2018/5/11 8:54
対応状況: −−−
登録日: 2016/7/22
居住地: 愛媛県
投稿: 1610
Re: カテゴリー数が多いと商品一覧が遅い
なるほど、親カテゴリーの登録は途中のバージョンからなのですね。
勉強になります。


----------------
EC-CUBE 《プラチナ》ランクパートナー
トエビス株式会社 田中 宏典
EC-CUBEの機能やデザインのカスタマイズ承ります。

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は88,288名です
総投稿数は109,688件です

投稿数ランキング

1
seasoft
7365
2
468
3217
3
AMUAMU
2712
4
nanasess
2303
5
umebius
2085
6
yuh
1818
7
h_tanaka
1610
8
red
1567
9
mcontact
1240
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
796
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.