【ECCube3】EC-Cubeでキーワード検索を高速化する方法
EC-Cube3で、商品点数が15万件くらいあると、
キーワード検索が死ぬほど遅くて使い物にならなかったので、
高速化のメモです。
最初からそうしておけよ・・・って感じがしなくもないですが、
商品一覧ページのGROUP BY句に、無駄なカラムがものすごく多く並んでいるせいで、死ぬほど重いSQL文が出来上がってしまっています。
これは、以下の方法で修正できます。
これで、120秒かかっていたキーワード検索が、たったの2秒になりましたwww
・・・いや、今までの苦労はなんだったんでしょうね。
EC-Cube3系は、ある程度、データベースにインデックスが貼られていますが、del_flgなど、一部インデックスが貼られていないカラムがあります。
微々たる高速化ですが、インデックスを貼ることが出来るカラムを探して、修正しておけば、少しは役に立つかも知れません。
まだ、MySQLのチューニングを行なっていない場合は、
クエリキャッシュを利用する事で、やや高速化に役立てる事が出来ます。
「vi /etc/my.cnf」などでMySQLの設定ファイルを開いて、
query_cache_limit=1M
query_cache_size=32M
のような形で記述し、保存して、MySQLを再起動すれば設定できます。
ただし、あくまでもキャッシュですので、
キャッシュが効いていない時は効果がありません。
EC-Cubeの場合、どのようなSQL文が実際に吐き出されているかの確認に、困る事があります。
筆者は、以下の方法で、確認しました。
まず、「vi /etc/my.cnf」などでMySQLの設定ファイルを開き、
general_log=1
general_log_file="/var/log/mysql/sql.log"
log_output=FILE
のような形で、ログファイルを吐き出すように設定を行います。
この時、sql.logのパーミッションに注意します。
mysqldから、sql.logにファイル書き込みが出来る必要がありますので、chmodなどで、ファイル書き込み権限を与えておきます。
MySQLを再起動すると、設定が有効になり、実行されたSQL文がログに出力されて行きます。
ただし、このままだと、ログファイルが膨大になってしまう可能性があるため、不要であれば、「#」などでコメントアウトしておきましょう。
※以下の項目は、バグが起きるため、結局利用しなくなりました。
これって結局、ちゃんとキャッシュが働いているのか微妙なところですが、せっかくなので設定しておきます。
「/app/config/eccube/doctrine_cache.yml」と、「/app/config/eccube/http_cache.yml」を新規作成して、それぞれに以下のような形で記述します。
キーワード検索が死ぬほど遅くて使い物にならなかったので、
高速化のメモです。
高速化に、一番効果があったもの
最初からそうしておけよ・・・って感じがしなくもないですが、
商品一覧ページのGROUP BY句に、無駄なカラムがものすごく多く並んでいるせいで、死ぬほど重いSQL文が出来上がってしまっています。
これは、以下の方法で修正できます。
/src/Eccube/Repository/ProductRepository.php:
$qb->groupBy('p');
になっている箇所を探し出して、
$qb->groupBy('p.id');
と修正すればおk。
$qb->groupBy('p');
になっている箇所を探し出して、
$qb->groupBy('p.id');
と修正すればおk。
これで、120秒かかっていたキーワード検索が、たったの2秒になりましたwww
・・・いや、今までの苦労はなんだったんでしょうね。
インデックスを見直す
EC-Cube3系は、ある程度、データベースにインデックスが貼られていますが、del_flgなど、一部インデックスが貼られていないカラムがあります。
微々たる高速化ですが、インデックスを貼ることが出来るカラムを探して、修正しておけば、少しは役に立つかも知れません。
MySQLのクエリキャッシュを利用する
まだ、MySQLのチューニングを行なっていない場合は、
クエリキャッシュを利用する事で、やや高速化に役立てる事が出来ます。
「vi /etc/my.cnf」などでMySQLの設定ファイルを開いて、
query_cache_limit=1M
query_cache_size=32M
のような形で記述し、保存して、MySQLを再起動すれば設定できます。
ただし、あくまでもキャッシュですので、
キャッシュが効いていない時は効果がありません。
実際に実行されているSQL文を確認する方法
EC-Cubeの場合、どのようなSQL文が実際に吐き出されているかの確認に、困る事があります。
筆者は、以下の方法で、確認しました。
まず、「vi /etc/my.cnf」などでMySQLの設定ファイルを開き、
general_log=1
general_log_file="/var/log/mysql/sql.log"
log_output=FILE
のような形で、ログファイルを吐き出すように設定を行います。
この時、sql.logのパーミッションに注意します。
mysqldから、sql.logにファイル書き込みが出来る必要がありますので、chmodなどで、ファイル書き込み権限を与えておきます。
MySQLを再起動すると、設定が有効になり、実行されたSQL文がログに出力されて行きます。
ただし、このままだと、ログファイルが膨大になってしまう可能性があるため、不要であれば、「#」などでコメントアウトしておきましょう。
EC-Cube3系のキャッシュ機能を利用する
※以下の項目は、バグが起きるため、結局利用しなくなりました。
「/app/config/eccube/doctrine_cache.yml」と、「/app/config/eccube/http_cache.yml」を新規作成して、それぞれに以下のような形で記述します。
/app/config/eccube/doctrine_cache.yml:
doctrine_cache:
metadata_cache:
driver: array
path:
host:
port:
password:
query_cache:
driver: array
path:
host:
port:
password:
result_cache:
driver: array
path:
host:
port:
password:
lifetime: 3600
clear_cache: true
hydration_cache:
driver: array
path:
host:
port:
password:
doctrine_cache:
metadata_cache:
driver: array
path:
host:
port:
password:
query_cache:
driver: array
path:
host:
port:
password:
result_cache:
driver: array
path:
host:
port:
password:
lifetime: 3600
clear_cache: true
hydration_cache:
driver: array
path:
host:
port:
password:
/app/config/eccube/http_cache.yml:
http_cache:
enabled: true
age: 10
# フロントでキャッシュを適用させる画面のrouteを設定
route:
- homepage
- product_list
- block_category
- block_news
- block_search_product
- help_about
- help_guide
- help_privacy
- help_tradelaw
- help_agreement
http_cache:
enabled: true
age: 10
# フロントでキャッシュを適用させる画面のrouteを設定
route:
- homepage
- product_list
- block_category
- block_news
- block_search_product
- help_about
- help_guide
- help_privacy
- help_tradelaw
- help_agreement
この記事の最終更新日:2018/05/11
最初に記事を書いた日:2018/05/09
この記事をシェアする
関連記事
- ・【ECCube3】「メルマガを受け取る」のチェックボックスを作る方法
- ・【ECCube3】お届け日の最大日数を設定する
- ・【ECCube3】AmazonPayで、お届け日調整プラグインが機能しない時の対策
- ・【ECCube3】クロネコとGMOペイメントで、受注編集画面のGMO決済ボタンがエラーになる件
- ・【ECCube3】管理画面のログをちゃんとソートする方法
- ・【EC-Cube3】Amazonペイメントとクロネコペイメントの組み合わせで受注編集画面のエラーが出る件
- ・【EC-Cube3】商品詳細ページに在庫数を表示したり、計算できるようにする
- ・【EC-Cube3】トップページに新着情報を自動表示する
- ・【EC-CUBE3】商品詳細ページだけH1タグの値を変える方法
- ・【EC-CUBE3】商品登録CSVの項目をプラグイン無しで変更する