Ticket #2325 (new 改善提案) — at Version 13
dtb_products_class の INDEX 追加
| Reported by: | nanasess | Owned by: | somebody |
|---|---|---|---|
| Priority: | 中 | Milestone: | EC-CUBE2.13.x |
| Component: | その他 | Version: | 2.12.5 |
| Keywords: | Cc: | ||
| 修正済み: | yes |
Description (last modified by Seasoft) (diff)
商品一覧を表示する際、 dtb_products_class にあるカラムの MAX, MIN を取得している。
JOIN (
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,
MAX(point_rate) AS point_rate,
MAX(deliv_fee) AS deliv_fee,
COUNT(*) as class_count
FROM dtb_products_class
WHERE del_flg = 0
GROUP BY product_id
) AS T4
MAX() 及び、 MIN() で参照するカラムに INDEX を付与することで高速化が期待できる。
(INDEX が無いと、全件走査して最大値、最小値を求めるが、INDEX があれば、INDEX の最大値、最小値を参照するのみなので、非常に高速)
CREATE INDEX dtb_products_class_price01_idx ON dtb_products_class (price01); CREATE INDEX dtb_products_class_price02_idx ON dtb_products_class (price02); CREATE INDEX dtb_products_class_stock_idx ON dtb_products_class (stock); CREATE INDEX dtb_products_class_stock_unlimited_idx ON dtb_products_class (stock_unlimited); CREATE INDEX dtb_products_class_point_rate_idx ON dtb_products_class (point_rate); CREATE INDEX dtb_products_class_deliv_fee_idx ON dtb_products_class (deliv_fee); CREATE INDEX dtb_products_class_product_id_idx ON dtb_products_class (product_id);
関連チケット
Change History
comment:2 Changed 13 years ago by h_yoshimoto
- Milestone changed from EC-CUBE2.13.0 to EC-CUBE 2.13.1
comment:5 Changed 12 years ago by kim
- Milestone changed from EC-CUBE2.13.3 to EC-CUBE2.13.4
nanasess様 今回は、2.13.4に回させていただきますが、 Indexのみのため、マイナーの範囲とさせていただき実装のご検討をお願いいたします。
comment:6 follow-up: ↓ 8 Changed 11 years ago by Seasoft
説明に記載のインデックスとクエリーの組み合わせでは、噛み合っていない気がします。
パフォーマンス改善はの状況は検証済みでしょうか?
comment:9 in reply to: ↑ 8 Changed 11 years ago by Seasoft
nanasess への返信
正確な検証は未実施です。(特にレンタルサーバー)
現況までの検証は EC-CUBE 経由で行っていますか? それとも、SQL で直接行っていますか?
もしも、前者でしたら、改善前後の状態を再現するのに必要な情報 (DB、テスト用のデータをどう用意するかなど) をお知らせいただけますと幸いです。
後者でしたら、SQL をご提供いただけますと幸いです。
comment:10 follow-up: ↓ 11 Changed 11 years ago by nanasess
1年以上前に、試したものなので、正確な情報が残っておらず、申し訳ございません。
PostgreSQL で、 dtb_products_class に50万レコードほど INSERT して軽く検証した程度です。 MySQL は未検証です。 データの生成は test/createEcCubeData-v25.php を使用しました。
comment:11 in reply to: ↑ 10 Changed 11 years ago by Seasoft
nanasess への返信
情報ありがとうございます。
偶然手元の PostgreSQL 開発環境の dtb_products_class が 505,000 行なので、直ぐに試すことができそうです。
商品一覧画面の読み込み時間を計る方法で宜しいでしょうか?
comment:12 Changed 11 years ago by Seasoft
このチケットの後、r23422 で実装が変わっているため、当時と効果が違っているかもしれませんね。
SC_DB_DBFactory_PGSQL::alldtlSQL をざっくり削除して、比較する必要もありそうですね。

大量の INDEX を張ると、ボトルネックになる場合もあるため注意が必要