条件付ですが速度改善できました。
今回私のやっている案件はデータ件数約1万件と多いものの、
・1商品に1カテゴリで問題ない点
・規格の概念を利用しない点
上の2点をクライアントに取り付ける事が出来たのでかなり独自路線の
カスタマイズをする事で基本1秒以内の表示を実現できました。
同じような条件の方はご参考までにどうぞ。
■1:データ更新
まず『dtb_products.category_id』しか見ないようにするのでデータを更新します。
まだ作ってませんがデータ登録のタイミングで同様の処理を書いておけばいいかな?と思っています。
引用:
update dtb_products a set a.category_id = (select max(b.category_id) from dtb_product_categories b where a.product_id = b.product_id ) ;
■2:SQL修正
data\class\pages\products\lc_page_products_list.php
・要点1
デフォルトのソート方法が異常に重いので無視。新着順とした。
・要点2
vw_products_allclassのviewが死ぬほど重いので捨てた。
・要点3
単一テーブルを見る分にはdistinctなんて必要ないので外した
・要点4
極力Joinを外して取得した結果から『(select min(product_code) ・・・』のような形とした。
dtb_products_class.product_idはユニークキーなので数があるように見えるが負荷は小さい。
引用:
//処理にかかわらずfromはこの形
$col = "T1.product_id,"
. "(select min(product_code) from dtb_products_class where product_id = T1.product_id ) AS product_code_min,"
. "(select max(product_code) from dtb_products_class where product_id = T1.product_id ) AS product_code_max,"
. "(select min(price01) from dtb_products_class where product_id = T1.product_id ) AS price01_min,"
. "(select max(price01) from dtb_products_class where product_id = T1.product_id ) AS price01_max,"
. "(select min(price02) from dtb_products_class where product_id = T1.product_id ) AS price02_min,"
. "(select max(price02) from dtb_products_class where product_id = T1.product_id ) AS price02_max,"
. "(select min(stock) from dtb_products_class where product_id = T1.product_id ) AS stock_min,"
. "(select max(stock) from dtb_products_class where product_id = T1.product_id ) AS stock_max,"
. "(select min(stock_unlimited) from dtb_products_class where product_id = T1.product_id ) AS stock_unlimited_min,"
. "(select max(stock_unlimited) from dtb_products_class where product_id = T1.product_id ) AS stock_unlimited_max,"
. "T1.del_flg,"
. "T1.status,"
. "T1.name,"
. "T1.comment1,"
. "T1.comment2,"
. "T1.comment3,"
. "T1.main_list_comment,"
. "T1.main_image,"
. "T1.main_list_image,"
. "T1.product_flag,"
. "T1.deliv_date_id,"
. "T1.sale_limit,"
. "T1.point_rate,"
. "T1.sale_unlimited,"
. "T1.create_date,"
. "T1.deliv_fee,"
. "T1.rank,"
. "T1.category_id as category_id" ;
$from = "dtb_products AS T1";
//表示順序
switch($orderby) {
//価格順
case 'price':
$order = "price02_min, product_id";
break;
//新着順
case 'date':
$order = "create_date DESC, product_id";
break;
default:
$order = "create_date DESC, product_id";
break;
■3:以下のロジックのカット
まったく使っていなくても以下のロジックが入っているだけでやたら重い事がわかった。
今回私が規格の要素を使わないのでロジックを外した。
引用:
// 規格名一覧
// $arrClassName = $objDb->sfGetIDValueList("dtb_class", "class_id", "name");
// 規格分類名一覧
// $arrClassCatName = $objDb->sfGetIDValueList("dtb_classcategory", "classcategory_id", "name");
// 規格セレクトボックス設定
// if($disp_num == 15) {
// for($i = 0; $i < count($this->arrProducts); $i++) {
// $this->lfMakeSelect($this->arrProducts[$i]['product_id'], $arrClassName, $arrClassCatName);
// // 購入制限数を取得
// $this->lfGetSaleLimit($this->arrProducts[$i]);
// }
// }