2009年4月3日金曜日

 

【EC-CUBE】商品表示のSQLクエリを改善する

使えるねっとの共有サーバでEC-CUBEを開設して幾日も経っていないのにサーバ負荷が酷いとお叱りを受け、専サバに移りゃとお達しがありました。
実際、商品の検索等の表示には数秒かかるにしてもそんなにアクセスがある訳でもありません。
「ああ、そういえば昨日商品の規格を編集してたらタイムアウトしまくったが、それか」と考えつつ一大事なので調べました。

EC-CUBEのDBはテーブルのリレーションが複雑で、データの取得時にサブクエリをたくさん発行するので処理が重くなるという印象が得られました。
改良されたSQLがありましたので、適応してみますとフォーラムに有ります通り、体感で判る程度の改善が見られました。
以下のファイルのメソッドを変更します。

 ファイル:data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php
 - クラス:SC_DB_DBFactory_MYSQL
 - メソッド:viewToSubQuery()
    function viewToSubQuery() {
     ~(略)~

"vw_products_allclass" => '
( SELECT
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,
T1.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,
T1.create_date,
deliv_fee,
T1.rank,
T4.category_rank,
T4.category_id
FROM
(
SELECT *
FROM
(
SELECT
product_id,
MIN(product_code) AS product_code_min,
MAX(product_code) AS product_code_max,
MIN(price01) AS price01_min,
MAX(price01) AS price01_max,
MIN(price02) AS price02_min,
MAX(price02) AS price02_max,
MIN(stock) AS stock_min,
MAX(stock) AS stock_max,
MIN(stock_unlimited) AS stock_unlimited_min,
MAX(stock_unlimited) AS stock_unlimited_max
FROM dtb_products_class
GROUP BY product_id
) AS T0
LEFT JOIN dtb_products USING (product_id)
) AS T1
INNER JOIN
(
SELECT
T2.product_id,
MAX(T2.category_id) AS category_id,
MAX(T3.rank) AS category_rank
FROM dtb_product_categories T2
INNER JOIN dtb_category T3 USING (category_id)
GROUP BY product_id
) AS T4
USING (product_id)
)',
~(略)~
   }

根本的な話としてMySQLを使わないというのが一番良いようで、PostgressSQLに移行しただけでも数千倍の改善が見られ、20~30秒ほど要していたのが一瞬で検索結果が表示されるとのことです。
それにしても、こういったことであからさまに問題が生じているのは商品件数が1000件を優に超えている状態の様ですが、当方のサイトでは数百件レベルです。リレーションの事があるとなると商品規格が多いからでしょうか。
そもそも共有サーバで運用することが無茶なのでしょうか。

追記:2010/03/25
MySQL の遅さをサブクエリの改善とコードの一部改良で手間暇かけずに解決する - EC-CUBE開発Wiki

こちらのクエリは微妙に違う。

関連

MySQLのVIEWで商品管理の規格表示を改善する - さぼてん[2010/03/25]

参考

EC-CUBE 開発コミュニティサイト - フォーラム 商品一覧の表示が遅い
EC CUBEの使用推奨環境に関してのご相談
 ∟もっとパフォーマンスのよいEC-CUBE

ラベル:


コメント: コメントを投稿

登録 コメントの投稿 [Atom]



この投稿へのリンク:

リンクを作成



<< ホーム

This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google