web-dev-qa-db-ja.com

Opencart mysqlクエリ最適化

MysqlでOpencart 2.xを使用しています。 Excelエクスポート用のカスタムモジュールを作成しました。クエリの実行に2分以上かかりました。クエリを最適化したいと思います。

EXPLAINは次の画像を示します

enter image description here

これは私の質問です

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
1
Ramesh S

クエリの速度が低下する理由は、クエリプランで明確に確認できます。クエリのパフォーマンスを調整するには、インデックスを作成する必要のある列があります。クエリで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`)

微調整を実装したら、クエリを実行してパフォーマンスの違いを確認します。

1