バージョン選択

フォーラム

メニュー

オンライン状況

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

サイト内検索

機能要望 > その他 > MySQL での一覧商品表示の速度向上について

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
hakaselab
投稿日時: 2009/3/18 16:34
対応状況: −−−
半人前
登録日: 2008/9/4
居住地: 広島
投稿: 28
MySQL での一覧商品表示の速度向上について
お世話になっております。高橋@株式会社システムフレンドです。たまに EC-CUBE の MySQL の速度の遅さが話題にあがっているので、
もっとパフォーマンスのよいEC-CUBE
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=2262&forum=3

今回改善してみました。何かの役にたてれば嬉しいです:D

http://ec-cube.systemfriend.co.jp/technique/article0008/

遅さのネックは商品規格取得のサブクエリ部分と、それを一覧で表示する際に商品ひとつごとにそのサブクエリを発行して規格を取得しているためです。

なので、まず、サブクエリ部分を改善し(SHOW STATUS では 1/3 程度に問合せ件数がなったことを確認しました)、規格取得部分を一括でとってくるように変更しました。

これとは別に1万件程度でおそくなるといわれている一つの原因は、おそらく、商品一覧での商品件数取得時に、SQLのカウントではなく、商品一覧をとったうえで、そのカウントをとっているので、メモリがスワップをおこしている可能性があるんじゃないかと思います。
(今回の改善にはこの部分はいれていませんが、何かの参考になれば)。

なお、作成点につきましては、2.0系開発環境の最新のものを対象にさせていただいております。間違いや、行き違いなどありましたら、申し訳ありませんが、指摘して下さると助かります。よろしくお願いします。


----------------
-------------------------------
株式会社システムフレンド
高橋純一

EC-CUBE工房
http://ec-cube.systemfriend.co.jp/
-------------------------------

lucky7
投稿日時: 2009/3/25 21:02
対応状況: −−−
一人前
登録日: 2008/6/2
居住地: 東京近郊
投稿: 101
Re: MySQL での一覧商品表示の速度向上について
貴重な情報ありがとうございます!

しかし残念ながら、システムエラー画面が表示されます。
若干カスタムしているので、それが原因でしょうか?


            "vw_products_allclass" => '
  (SELECT
                    ,pr.product_id
                    ,pl.product_code_min
                    ,pl.product_code_max
                    ,pl.price01_min
                    ,pl.price01_max
                    ,pl.price02_min
                    ,pl.price02_max
                    ,pl.stock_min
                    ,pl.stock_max
                    ,pl.stock_unlimited_min
                    ,pl.stock_unlimited_max
                    ,pr.del_flg
                    ,pr.status
                    ,pr.name
                    ,pr.comment1,
                    ,pr.comment2,
                    ,pr.comment3,
                    ,pr.comment4,
                    ,pr.comment5,
                    ,pr.comment6,
                    ,pr.comment7,
                    ,pr.comment8,
                    ,pr.comment9,
                    ,pr.comment10,
                    ,pr.comment11,
                    ,pr.comment12,
                    ,pr.comment13,
                    ,pr.comment14,
                    ,pr.comment15,
                    ,pr.comment16,
                    ,pr.comment17,
                    ,pr.comment18,
                    ,pr.comment19,
                    ,pr.comment20,
                    ,pr.comment21,
                    ,pr.comment22,
                    ,pr.comment23,
                    ,pr.comment24,
                    ,pr.comment25,
                    ,pr.update_date,
                    ,pr.main_list_comment
                    ,pr.main_image
                    ,pr.main_list_image
                    ,pr.product_flag
                    ,pr.deliv_date_id
                    ,pr.sale_limit
                    ,pr.point_rate
                    ,pr.sale_unlimited
                    ,pr.create_date
                    ,pr.deliv_fee
                    ,pc.rank
                    ,cc.rank AS category_rank
                    ,cc.category_id
                FROM
                    (((SELECT
                        product_id as product_id_sub
                        ,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 pl
                    LEFT JOIN dtb_products AS pr ON pl.product_id_sub = pr.product_id) LEFT JOIN dtb_product_categories AS pc ON pr.product_id = pc.product_id) LEFT JOIN dtb_category AS cc ON pc.category_id = cc.category_id) ',


----------------
EC-CUBEバージョン 2.1.2
PHPバージョン PHP 4.3.9
DBバージョン MySQL 4.1.20

seasoft
投稿日時: 2009/3/25 21:07
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7332
Re: MySQL での一覧商品表示の速度向上について
エラー文も貼っておいた方が良いかと思います。

先ほど Ver 2.4 系でも高速化のロジックが実装されたようなので、何か参考になる部分があるかも。
http://svn.ec-cube.net/open_trac/changeset/17925


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

lucky7
投稿日時: 2009/3/25 21:25
対応状況: −−−
一人前
登録日: 2008/6/2
居住地: 東京近郊
投稿: 101
Re: MySQL での一覧商品表示の速度向上について
LOGはこのようになっていました…
難解です(;一_一)

2009/03/25 21:20:37 [/index.php] http://**************.com/

SERVER_ADDR:--------------
REMOTE_ADDR:--------------
USER_AGENT:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19

SELECT DISTINCT A.*, name, price02_min, price01_min, main_list_image ,comment13 FROM dtb_best_products AS A INNER JOIN (SELECT pr.product_id ,pl.product_code_min ,pl.product_code_max ,pl.price01_min ,pl.price01_max ,pl.price02_min ,pl.price02_max ,pl.stock_min ,pl.stock_max ,pl.stock_unlimited_min ,pl.stock_unlimited_max ,pr.del_flg ,pr.status ,pr.name ,pr.comment1, ,pr.comment2, ,pr.comment3, ,pr.comment4, ,pr.comment5, ,pr.comment6, ,pr.comment7, ,pr.comment8, ,pr.comment9, ,pr.comment10, ,pr.comment11, ,pr.comment12, ,pr.comment13, ,pr.comment14, ,pr.comment15, ,pr.comment16, ,pr.comment17, ,pr.comment18, ,pr.comment19, ,pr.comment20, ,pr.comment21, ,pr.comment22, ,pr.comment23, ,pr.comment24, ,pr.comment25, ,pr.update_date, ,pr.main_list_comment ,pr.main_image ,pr.main_list_image ,pr.product_flag ,pr.deliv_date_id ,pr.sale_limit ,pr.point_rate ,pr.sale_unlimited ,pr.create_date ,pr.deliv_fee ,pc.rank ,cc.rank AS category_rank ,cc.category_id FROM (((SELECT product_id as product_id_sub ,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 pl LEFT JOIN dtb_products AS pr ON pl.product_id_sub = pr.product_id) LEFT JOIN dtb_product_categories AS pc ON pr.product_id = pc.product_id) LEFT JOIN dtb_category AS cc ON pc.category_id = cc.category_id) AS allcls using(product_id) WHERE status = 1 ORDER BY rand()
DB Error: syntax error

SELECT DISTINCT A.*, name, price02_min, price01_min, main_list_image ,comment13 FROM dtb_best_products AS A INNER JOIN (SELECT pr.product_id ,pl.product_code_min ,pl.product_code_max ,pl.price01_min ,pl.price01_max ,pl.price02_min ,pl.price02_max ,pl.stock_min ,pl.stock_max ,pl.stock_unlimited_min ,pl.stock_unlimited_max ,pr.del_flg ,pr.status ,pr.name ,pr.comment1, ,pr.comment2, ,pr.comment3, ,pr.comment4, ,pr.comment5, ,pr.comment6, ,pr.comment7, ,pr.comment8, ,pr.comment9, ,pr.comment10, ,pr.comment11, ,pr.comment12, ,pr.comment13, ,pr.comment14, ,pr.comment15, ,pr.comment16, ,pr.comment17, ,pr.comment18, ,pr.comment19, ,pr.comment20, ,pr.comment21, ,pr.comment22, ,pr.comment23, ,pr.comment24, ,pr.comment25, ,pr.update_date, ,pr.main_list_comment ,pr.main_image ,pr.main_list_image ,pr.product_flag ,pr.deliv_date_id ,pr.sale_limit ,pr.point_rate ,pr.sale_unlimited ,pr.create_date ,pr.deliv_fee ,pc.rank ,cc.rank AS category_rank ,cc.category_id FROM (((SELECT product_id as product_id_sub ,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 pl LEFT JOIN dtb_products AS pr ON pl.product_id_sub = pr.product_id) LEFT JOIN dtb_product_categories AS pc ON pr.product_id = pc.product_id) LEFT JOIN dtb_category AS cc ON pc.category_id = cc.category_id) AS allcls using(product_id) WHERE status = 1 ORDER BY rand() [nativecode=1064 ** You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'pr.comment2, ,pr.comment3, ,pr.comment4,' at line 1]

/var/www/vhosts/**************.com/httpdocs/index.php 38:lc_page_index_ex->process
/var/www/vhosts/**************.com/httpdocs/data/class_extends/page_extends/LC_Page_Index_Ex.php 56:lc_page_index->process
/var/www/vhosts/**************.com/httpdocs/data/class/pages/LC_Page_Index.php 75:sc_siteview->display
/var/www/vhosts/**************.com/httpdocs/data/class/SC_View.php 134:smarty->display
/var/www/vhosts/**************.com/httpdocs/data/module/Smarty/libs/Smarty.class.php 1108:smarty->fetch
/var/www/vhosts/**************.com/httpdocs/data/module/Smarty/libs/Smarty.class.php 1258:include
/var/www/vhosts/**************.com/httpdocs/data/Smarty/templates_c/default/%%F1^F15^F158E3F4%%site_frame.tpl.php 79:smarty->_smarty_include
/var/www/vhosts/**************.com/httpdocs/data/module/Smarty/libs/Smarty.class.php 1871:include
/var/www/vhosts/**************.com/httpdocs/data/Smarty/templates_c/default/%%58^587^5876E692%%site_main.tpl.php 63:smarty_core_smarty_include_php
/var/www/vhosts/**************.com/httpdocs/data/module/Smarty/libs/internals/core.smarty_include_php.php 40:smarty->_include
/var/www/vhosts/**************.com/httpdocs/data/module/Smarty/libs/Smarty.class.php 1925:include
/var/www/vhosts/**************.com/httpdocs/frontparts/bloc/best5.php 33:lc_page_frontparts_bloc_best5_ex->process
/var/www/vhosts/**************.com/httpdocs/data/class_extends/page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Best5_Ex.php 56:lc_page_frontparts_bloc_best5->process
/var/www/vhosts/**************.com/httpdocs/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Best5.php 68:lc_page_frontparts_bloc_best5_ex->lfgetranking
/var/www/vhosts/**************.com/httpdocs/data/class/pages/frontparts/bloc/LC_Page_FrontParts_Bloc_Best5.php 113:sc_query->select
/var/www/vhosts/**************.com/httpdocs/data/class/SC_Query.php 95:sc_dbconn->getall
/var/www/vhosts/**************.com/httpdocs/data/class/SC_DbConn.php 161:db_mysql->getall
/var/www/vhosts/**************.com/httpdocs/data/module/DB/common.php 1613:db_mysql->query
/var/www/vhosts/**************.com/httpdocs/data/module/DB/common.php 1167:db_mysql->simplequery
/var/www/vhosts/**************.com/httpdocs/data/module/DB/mysql.php 324:db_mysql->mysqlraiseerror
/var/www/vhosts/**************.com/httpdocs/data/module/DB/mysql.php 894:db_mysql->raiseerror
/var/www/vhosts/**************.com/httpdocs/data/module/DB/common.php 1853:pear->raiseerror
/var/www/vhosts/**************.com/httpdocs/data/module/PEAR.php 557:db_error->db_error
/var/www/vhosts/**************.com/httpdocs/data/module/DB.php 893:db_error->pear_error
from **************


----------------
EC-CUBEバージョン 2.1.2
PHPバージョン PHP 4.3.9
DBバージョン MySQL 4.1.20

lucky7
投稿日時: 2009/3/25 22:04
対応状況: −−−
一人前
登録日: 2008/6/2
居住地: 東京近郊
投稿: 101
Re: MySQL での一覧商品表示の速度向上について
自分の記述のミスを発見したので修正しましたが、
やはり、エラーになります。

修正後

"vw_products_allclass" => '
  (SELECT
                    pr.product_id
                    ,pl.product_code_min
                    ,pl.product_code_max
                    ,pl.price01_min
                    ,pl.price01_max
                    ,pl.price02_min
                    ,pl.price02_max
                    ,pl.stock_min
                    ,pl.stock_max
                    ,pl.stock_unlimited_min
                    ,pl.stock_unlimited_max
                    ,pr.del_flg
                    ,pr.status
                    ,pr.name
                    ,pr.comment1
                    ,pr.comment2
                    ,pr.comment3
                    ,pr.comment4
                    ,pr.comment5
                    ,pr.comment6
                    ,pr.comment7
                    ,pr.comment8
                    ,pr.comment9
                    ,pr.comment10
                    ,pr.comment11
                    ,pr.comment12
                    ,pr.comment13
                    ,pr.comment14
                    ,pr.comment15
                    ,pr.comment16
                    ,pr.comment17
                    ,pr.comment18
                    ,pr.comment19
                    ,pr.comment20
                    ,pr.comment21
                    ,pr.comment22
                    ,pr.comment23
                    ,pr.comment24
                    ,pr.comment25
                    ,pr.update_date
                    ,pr.main_list_comment
                    ,pr.main_image
                    ,pr.main_list_image
                    ,pr.product_flag
                    ,pr.deliv_date_id
                    ,pr.sale_limit
                    ,pr.point_rate
                    ,pr.sale_unlimited
                    ,pr.create_date
                    ,pr.deliv_fee
                    ,pc.rank
                    ,cc.rank AS category_rank
                    ,cc.category_id
                FROM
                    (((SELECT
                        product_id as product_id_sub
                        ,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 pl
                    LEFT JOIN dtb_products AS pr ON pl.product_id_sub = pr.product_id)
                    LEFT JOIN dtb_product_categories AS pc ON pr.product_id = pc.product_id)
                    LEFT JOIN dtb_category AS cc ON pc.category_id = cc.category_id) ',


ログのエラーが読めないのですが、どの部分が重要でしょうか?
DB Error: syntax error
でしょうか?


----------------
EC-CUBEバージョン 2.1.2
PHPバージョン PHP 4.3.9
DBバージョン MySQL 4.1.20

seasoft
投稿日時: 2009/3/25 22:09
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7332
Re: MySQL での一覧商品表示の速度向上について
> ログのエラーが読めないのですが、どの部分が重要でしょうか?
> DB Error: syntax error
> でしょうか?

そうですね。
列名が違うとかでなく、構文が誤っているという指摘ですね。

その次の行に、もう少し詳しい(MySQL ネイティブの)エラーが出ています。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

seasoft
投稿日時: 2009/3/25 22:12
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7332
Re: MySQL での一覧商品表示の速度向上について
引用:
,pr.comment1,
,pr.comment2,
,pr.comment3,
,pr.comment4,
,pr.comment5,
,pr.comment6,
,pr.comment7,
,pr.comment8,
,pr.comment9,
,pr.comment10,
,pr.comment11,
,pr.comment12,
,pr.comment13,
,pr.comment14,
,pr.comment15,
,pr.comment16,
,pr.comment17,
,pr.comment18,
,pr.comment19,
,pr.comment20,
,pr.comment21,
,pr.comment22,
,pr.comment23,
,pr.comment24,
,pr.comment25,
,pr.update_date,

なんか、前後にカンマ付いちゃってますけど・・・
ここですかね。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

seasoft
投稿日時: 2009/3/25 22:15
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7332
Re: MySQL での一覧商品表示の速度向上について
・・・と思ったら、後のは修正してありますね。
失礼しました。

えっと、そちらでのエラー文は・・・


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

lucky7
投稿日時: 2009/3/25 22:22
対応状況: −−−
一人前
登録日: 2008/6/2
居住地: 東京近郊
投稿: 101
Re: MySQL での一覧商品表示の速度向上について
あっ!
失礼しました!

エラー文は
DB Error: syntax error
です><

---以下---
SELECT DISTINCT A.*, name, price02_min, price01_min, main_list_image ,comment13 FROM dtb_best_products AS A INNER JOIN (SELECT pr.product_id ,pl.product_code_min ,pl.product_code_max ,pl.price01_min ,pl.price01_max ,pl.price02_min ,pl.price02_max ,pl.stock_min ,pl.stock_max ,pl.stock_unlimited_min ,pl.stock_unlimited_max ,pr.del_flg ,pr.status ,pr.name ,pr.comment1 ,pr.comment2 ,pr.comment3 ,pr.comment4 ,pr.comment5 ,pr.comment6 ,pr.comment7 ,pr.comment8 ,pr.comment9 ,pr.comment10 ,pr.comment11 ,pr.comment12 ,pr.comment13 ,pr.comment14 ,pr.comment15 ,pr.comment16 ,pr.comment17 ,pr.comment18 ,pr.comment19 ,pr.comment20 ,pr.comment21 ,pr.comment22 ,pr.comment23 ,pr.comment24 ,pr.comment25 ,pr.update_date ,pr.main_list_comment ,pr.main_image ,pr.main_list_image ,pr.product_flag ,pr.deliv_date_id ,pr.sale_limit ,pr.point_rate ,pr.sale_unlimited ,pr.create_date ,pr.deliv_fee ,pc.rank ,cc.rank AS category_rank ,cc.category_id FROM (((SELECT product_id as product_id_sub ,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 pl LEFT JOIN dtb_products AS pr ON pl.product_id_sub = pr.product_id) LEFT JOIN dtb_product_categories AS pc ON pr.product_id = pc.product_id) LEFT JOIN dtb_category AS cc ON pc.category_id = cc.category_id) AS allcls using(product_id) WHERE status = 1 ORDER BY rand() [nativecode=1064 ** You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AS pl LEFT JOIN dtb_products AS pr ON pl.product_id_sub = pr' at line 1]


) AS pl
                    LEFT JOIN dtb_products AS pr ON pl.product_id_sub = pr.product_id)
                    LEFT JOIN dtb_product_categories AS pc ON pr.product_id = pc.product_id)
                    LEFT JOIN dtb_category AS cc ON pc.category_id = cc.category_id) ',

ココを見やすく3行に改行したのですが、何か影響出てしまいますか?

>先ほど Ver 2.4 系でも高速化のロジックが実装されたようなので、何か参考になる部分があるかも。
こちらの修正は無事できました!ありがとうございました!
(計測してませんが、感覚では結構速くなるものですね!)


----------------
EC-CUBEバージョン 2.1.2
PHPバージョン PHP 4.3.9
DBバージョン MySQL 4.1.20

seasoft
投稿日時: 2009/3/25 22:51
対応状況: −−−
登録日: 2008/6/4
居住地:
投稿: 7332
Re: MySQL での一覧商品表示の速度向上について
> ココを見やすく3行に改行したのですが、何か影響出てしまいますか?

それは問題ないと思います。
追加した文のカラムなど、若干書き換えましたが、PostgreSQL だと通りますね。MySQL 用のはずなのに何故だ ^^;

> >先ほど Ver 2.4 系でも高速化のロジックが実装されたようなので、何か参考になる部分があるかも。
> こちらの修正は無事できました!ありがとうございました!
> (計測してませんが、感覚では結構速くなるものですね!)

別解にて回避できたようですね。
DB のパフォーマンスは、ほんの少しのことで100倍単位でパフォーマンスが変わることもあります。

このあいだ私どもの顧客と話題になったのですが、EC-CUBE は規格が賢い反面、規格で足を引きずっているんですよね。色々、両立は難しいものですね。


----------------
Seasoft
こちらでの投稿は、アイディア程度に留めさせていただいております。
個別案件の作業は有償で承っております。お気軽にご相談ください。

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


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は63,569名です
総投稿数は96,794件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
468
2435
4
nanasess
2077
5
yuh
1612
6
umebius
1588
7
red
1406
8
h_tanaka
1022
9
fukap
907
10
tsuji
863
11
shutta
835
12
tao_s
792
13 ramrun 789
14 karin 657
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

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

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