2010-07-12 5 views
2

Я знаю, что лучший способ - не иметь никакого sql внутри другого sql, особенно сложного, и было бы лучше использовать анализ после запроса, но поскольку способ сборки системы я бы предпочел сделать это только на одном запросеЛюбая оптимизация Идея для этого SQL (mySQL)?

Вот запрос в вопрос («это действительно круто запрос»)

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 (в настоящее время он занимает Arround 2 минуты в режиме реального времени)

+3

Какие индексы у вас есть на разных таблицах? Вы сделали EXPLAIN в запросе? –

+0

Это запрос, сделанный oscommerce, с несколькими дополнительными полями oscommerce имеют все таблицы на myisam с одним первичным ключом, который является автономным, они не имеют никакого отношения. Здесь вы получите объяснение: http: // www. todoastros.com/explain.htm Спасибо за ответ;) – Saikios

ответ

2

Обычно это большое улучшение для перемещения подзапроса в FROM. http://dev.mysql.com/doc/refman/5.1/en/rewriting-subqueries.html

Не используйте соединения с запятой, смешивание надлежащих присоединяемых соединений и соединений с запятой часто прерывается.
И я вижу, что таблица orders_status s не имеет отношения к какой-либо другой таблице. Добавление правильного отношения должно увеличивать производительность во много раз.

Use EXPLAIN для анализа эффективности запросов и поиска мест для оптимизации.

+0

Большое спасибо, это был order_status, он остается от старого запроса, лично я ненавижу присоединиться, и сейчас я ненавижу немцев, потому что они избили Аргентину в WC (2006, 2010 И, конечно, и особенно в 1990 году), но на данный момент это потому, что они построили oscommerce: D Thank ou again Naktibalda: D В любом случае, я знаю, что мне все равно нужно оптимизировать код: P – Saikios

0

Вывод вашего EXPLAIN показывает, что для вашего запроса недостаточно индексов, чтобы выполнить его без полного сканирования таблицы. Худшим нарушителем является таблица orders_products, которая не имеет подходящего индекса на столбце orders_id.

Вы должны проверить, что каждый столбец, используемый в ваших условиях JOIN, имеет индекс. Это само по себе поможет.

+0

Спасибо Майку, я проверю это :) – Saikios

Смежные вопросы