MysqlでOpencart 2.xを使用しています。 Excelエクスポート用のカスタムモジュールを作成しました。クエリの実行に2分以上かかりました。クエリを最適化したいと思います。
EXPLAIN
は次の画像を示します
これは私の質問です
SELECT o.order_id,
Concat(o.firstname, ' ', o.lastname) AS customer,
pov.sku,
oo.value,
pov.segment,
pov.colour,
op.quantity,
o.shipping_address_1,
o.shipping_address_2,
o.shipping_city,
o.shipping_zone,
o.shipping_country,
o.shipping_postcode,
(SELECT os.NAME
FROM oc_order_status os
WHERE os.order_status_id = o.order_status_id
AND os.language_id = '1') AS order_status,
(SELECT Count(order_product_id)
FROM oc_order_product
WHERE order_id = o.order_id) AS product_count,
(SELECT ot.value
FROM oc_order_total ot
WHERE o.order_id = ot.order_id
AND ot.code = 'coupon') AS coupon,
(SELECT ot.value
FROM oc_order_total ot
WHERE o.order_id = ot.order_id
AND ot.title LIKE '%Shipping Fee%') AS shipping_cost,
(SELECT ot.value
FROM oc_order_total ot
WHERE o.order_id = ot.order_id
AND ot.title LIKE '%COD Fee (30 INR)%') AS cod,
(SELECT ot.value
FROM oc_order_total ot
WHERE o.order_id = ot.order_id
AND ot.title = 'CGST') AS cgst,
(SELECT ot.value
FROM oc_order_total ot
WHERE o.order_id = ot.order_id
AND ot.title = 'SGST') AS sgst,
(SELECT ot.value
FROM oc_order_total ot
WHERE o.order_id = ot.order_id
AND ot.title LIKE '%Sub-Total%') AS sub_total,
o.total,
o.currency_code,
o.currency_value,
o.payment_method,
o.date_added,
o.date_modified
FROM oc_order o
LEFT JOIN oc_order_option oo
ON ( oo.order_id = o.order_id )
LEFT JOIN oc_product_option_value pov
ON ( pov.product_option_value_id = oo.product_option_value_id )
LEFT JOIN oc_order_product op
ON( o.order_id = op.order_id )
WHERE o.order_status_id >= 0
GROUP BY oo.order_option_id
ORDER BY o.order_id DESC
クエリの速度が低下する理由は、クエリプランで明確に確認できます。クエリのパフォーマンスを調整するには、インデックスを作成する必要のある列があります。クエリでoc_order_optionorder_id列にインデックスが付けられていないテーブルを使用しました。次のコマンドを使用してインデックスを作成します。
ALTER TABLE `oc_order_option` ADD KEY `OrderID` (`order_id`)
同じことがoc_order_productでも発生しており、次のコマンドで調整する必要があります。
ALTER TABLE `oc_order_product` ADD KEY `ProductOrderID` (`order_id`)
また、oc_orderを微調整する必要もあります。以下を使用します。
ALTER TABLE `oc_order` ADD KEY `OrderStatusID` (`order_status_id`)
微調整を実装したら、クエリを実行してパフォーマンスの違いを確認します。