fc2ブログ

だもん

だもん

DBにMySQLを使っているときに、商品管理画面の規格表示に時間が掛る時がある。

色々条件を調べてみると、商品数が問題ではなく 商品に紐付く規格が多くなると表示が遅くなるみたい。



MySQL → PostgreSQL に変えるとはやくなるみたいですが、なんとかMySQLのままで性能が改善しないか色々調べてみたところ、

/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php のクエリをチューニングすれば改善することが判明。


で、ですが・・・vw_cross_class とか vw_cross_products_class って名称なのに viewじゃないじゃないか!


ということで、ビューをを作って試してみました。

1.まず view作成

商品 の 規格1 * 規格2 を取得しているクエリの中で vw_cross_class と vw_cross_products_class をview生成。

create view view_cross_class as SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2 FROM dtb_classcategory AS T1, dtb_classcategory AS T2;


create view view_cross_products_class_sub as SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2 FROM dtb_classcategory AS T1, dtb_classcategory AS T2;


create view view_cross_products_class as SELECT T1.class_id1, T1.class_id2, T1.classcategory_id1, T1.classcategory_id2, T2.product_id, T1.name1, T1.name2, T2.product_code, T2.stock, T2.price01, T2.price02, T1.rank1, T1.rank2 FROM view_cross_products_class_sub AS T1 LEFT JOIN dtb_products_class AS T2 ON T1.classcategory_id1 = T2.classcategory_id1 AND T1.classcategory_id2 = T2.classcategory_id2;


2.次に /data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php の修正

"vw_cross_class" => '(SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2 FROM dtb_classcategory AS T1, dtb_classcategory AS T2)'

↓ これを

"vw_cross_class" => 'view_cross_class'


@もう一か所

"vw_cross_products_class" =>'(SELECT T1.class_id1, T1.class_id2, T1.classcategory_id1, T1.classcategory_id2, T2.product_id, T1.name1, T1.name2, T2.product_code, T2.stock, T2.price01, T2.price02, T1.rank1, T1.rank2 FROM (SELECT T1.class_id AS class_id1, T2.class_id AS class_id2, T1.classcategory_id AS classcategory_id1, T2.classcategory_id AS classcategory_id2, T1.name AS name1, T2.name AS name2, T1.rank AS rank1, T2.rank AS rank2 FROM dtb_classcategory AS T1, dtb_classcategory AS T2 ) AS T1 LEFT JOIN dtb_products_class AS T2 ON T1.classcategory_id1 = T2.classcategory_id1 AND T1.classcategory_id2 = T2.classcategory_id2) '

↓ これを

"vw_cross_products_class" => 'view_cross_products_class'



結果♪
ビックリするくらい早くなりました!!

もう他のチューニングはいらないかな・・・
(indexはデフォルトから他所変更してます)

Posted by

Comments 7

There are no comments yet.
F.Makino  
No Title

規格300個追加したら応答停止したのでコード見たらアラびっくり、手軽な対応はないものかととりあえずvw_cross_products_classでググってこちらにたどり着きました。
有難うございました効果抜群です。

2010/03/17 (Wed) 11:49 | EDIT | REPLY |   
団子  
参考になりました。

ありがとうございます。
ソースの「T2ON」の部分にスペースを入れた方が・・・。

2010/04/13 (Tue) 12:26 | EDIT | REPLY |   
bunbun  
非常に助かりました。

ありがとうございます。
規格が650件近くあり、遅くて困っていたところを、お客様に、こちらを紹介していただき、助けられました。

viewを作ってしまう発想は、思いつきませんでした。

2010/11/09 (Tue) 21:43 | EDIT | REPLY |   
てっちゃん  
初心者の質問です

なんとかここにたどり着いたのですが、初心者の質問ですみませんが、教えてください。

「商品 の 規格1 * 規格2 を取得しているクエリの中で vw_cross_class とvw_cross_products_class をview生成。」とありますが、具体的にはどこに書いたら良いのでしょうか?

よろしくお願いします。

2010/11/11 (Thu) 16:14 | EDIT | REPLY |   
nayuzak  
Re: 初心者の質問です

てっちゃん さん
返信遅くなりました><

> 「商品 の 規格1 * 規格2 を取得しているクエリの中で vw_cross_class とvw_cross_products_class をview生成。」とありますが、具体的にはどこに書いたら良いのでしょうか?
こちらですが、現在 MySQLのEC-CUBEテーブルが格納されている場所と同じ場所に作成します。

環境によって異なりますが・・・
mysql -uユーザ名 -p
Enter password: 123456

にてMySQLへログインしていただき、以下でEC-CUBEのテーブルが配置されているDBを指定します。
mysql> USE ec-cubeDB;

この状態で記事の以下を実行することでMySQLへViewが作成されます。
mysql> create view view_cross_class・・・

後は、/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php を修正することで、自動的にViewが参照されるようになります。

2010/11/17 (Wed) 15:59 | EDIT | REPLY |   
ひできち  
これは凄いテクニック!

規格関連の表示の遅さを改善すべくいろいろ調べている内にこちらに辿り着きました。
記載通り修正すると劇的に改善されびっくりです。
有益な情報をご提供頂きありがとうございました。

2011/01/18 (Tue) 14:32 | EDIT | REPLY |   
-  
承認待ちコメント

このコメントは管理者の承認待ちです

2012/06/15 (Fri) 16:47 | EDIT | REPLY |   

Leave a reply