2


0

このSQL(mySQL)の最適化のアイデアはありますか?

私は最良の方法は他のSQL、特に複雑なSQL内にSQLを入れないことであり、クエリの後に分析を使用する方が良いことを知っていますが、システムが構築される方法のため、1つだけでそれを行うことが好ましい問い合わせ

問題のクエリは次のとおりです(「本当にクールなクエリです」)

SELECT DISTINCT
  o.orders_id,
  o.faltantes,
  o.customers_name,
  o.payment_method,
  o.date_purchased,
  o.last_modified,
  o.currency,
  o.currency_value,
  ot.text          AS order_total,
  st.stores_name
FROM (orders o
   LEFT JOIN orders_total ot
     ON (o.orders_id = ot.orders_id),
   stores st,
   orders_status s)
  INNER JOIN orders_products op
    ON (o.orders_id = op.orders_id)
WHERE o.orders_status != 19
    AND ot.class = 'ot_total'
    AND (ot.value > (SELECT
                       SUM(pc.monto)        +SUM(p.monto)
                     FROM pagos_clientes pc,
                       pagos p
                     WHERE p.id_pago = pc.id_pago
                         AND pc.id_oferta = o.orders_id)
          OR (SELECT
                SUM(pc.monto)        +SUM(p.monto)
              FROM pagos_clientes pc,
                pagos p
              WHERE p.id_pago = pc.id_pago
                  AND pc.id_oferta = o.orders_id)IS NULL)
    AND payment_method != 'Cambio por faltantes'
    AND o.orders_stores_id = '3'
    AND o.orders_stores_id = st.stores_id
    AND ((o.orders_stores_id IN(1,3))
          OR (op.products_distributors_id = '0'))
GROUP BY o.orders_id
ORDER BY o.orders_id DESC

この質問を解決できる人に感謝します:D(現在、リアルタイムで約2分かかります)

2 Answer


2


通常、サブクエリをFROMに移動すると大きな改善になります。 http://dev.mysql.com/doc/refman/5.1/en/rewriting-subqueries.html

コンマ結合は使用しないでください。適切なJOINとコンマ結合の組み合わせは、しばしば中断します。 +そして、orders_statusのテーブルは他のテーブルとは関係がないことがわかります。 適切な関係を追加すると、パフォーマンスが何度も向上するはずです。

EXPLAINを使用でクエリのパフォーマンスを分析し、最適化の場所を見つけます。


0


EXPLAIN`の出力は、テーブル全体のスキャンを実行せずにクエリを実行できる十分なインデックスがないことを示しています。 最悪の犯罪者は、 `orders_id`カラムに適切なインデックスを持たない orders_products`テーブルです。

`JOIN`条件で使用される各列にインデックスがあることを確認する必要があります。 これだけでも大いに役立ちます。