質問 > フロント機能 > カテゴリー数が多いと商品一覧が遅い |
フロント機能
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
投稿者 | スレッド |
---|---|
h_tanaka |
投稿日時: 2018/5/8 17:27
対応状況: 解決済
|
神 登録日: 2016/7/22 居住地: 愛媛県 投稿: 1646 |
カテゴリー数が多いと商品一覧が遅い 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() において、
の箇所で再帰的にカテゴリーを取得しているためと思われます。 src/Eccube/Entity/Category.php
この箇所のパフォーマンスを改善したいのですが、解決方法わかりますでしょうか?
|
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テーブルに保存するようになっていたと思います。
|
h_tanaka |
投稿日時: 2018/5/8 17:48
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 愛媛県 投稿: 1646 |
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
|
nanasess |
投稿日時: 2018/5/8 18:04
対応状況: −−−
|
神 登録日: 2006/9/9 居住地: 投稿: 2313 |
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 居住地: 愛媛県 投稿: 1646 |
Re: カテゴリー数が多いと商品一覧が遅い nanasess 様
MySQL 5.6.37 ですね・・。 SQL発行回数を極力少なくして再帰的に子カテゴリーを取得する方法を検討してみます。
|
468 |
投稿日時: 2018/5/8 20:10
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: カテゴリー数が多いと商品一覧が遅い インストール直後の状態で、
管理側にて、パーコレータの編集画面を表示してカテゴリにフォークを選択して登録後、 フロント側で「キッチンツール」「食器」で検索してパーコレータが表示されるのを確認していました。 商品データを一括登録されている場合などは、 親カテゴリの情報がdtb_product_categoryに登録されていないのかもしれませんね。
|
h_tanaka |
投稿日時: 2018/5/9 9:31
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 愛媛県 投稿: 1646 |
Re: カテゴリー数が多いと商品一覧が遅い 468 様
確かに、パンくずリストを簡略化するために、商品登録および商品CSV登録における親カテゴリーの自動登録処理をコメントアウトしておりました。 商品と親カテゴリーが紐づいているのでしたら先のご提案の方法が有効そうですね。 試してみます。
|
h_tanaka |
投稿日時: 2018/5/10 17:45
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 愛媛県 投稿: 1646 |
Re: カテゴリー数が多いと商品一覧が遅い 468 様
ご提案の方法でうまく動作しました。 ありがとうございました!
|
468 |
投稿日時: 2018/5/11 8:14
対応状況: −−−
|
神 登録日: 2008/10/26 居住地: 投稿: 3217 |
Re: カテゴリー数が多いと商品一覧が遅い ご連絡ありがとうございます。
無事動作したという事で安心しました。 3.0.12か3.0.13ぐらいのバージョンで商品登録時に親カテゴリを記録するように仕様変更されていましたので、 商品検索処理において、親→子カテゴリを走査する処理は無くなったと思っていましたが、残っていたのですね。 弊社でもカテゴリが多いサイトでは、該当処理を改修しておきたいと思います。
|
h_tanaka |
投稿日時: 2018/5/11 8:54
対応状況: −−−
|
神 登録日: 2016/7/22 居住地: 愛媛県 投稿: 1646 |
Re: カテゴリー数が多いと商品一覧が遅い なるほど、親カテゴリーの登録は途中のバージョンからなのですね。
勉強になります。
|
(1) 2 » |
スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |