Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个SQL(mySQL)有什么优化的想法吗?_Sql_Mysql - Fatal编程技术网

这个SQL(mySQL)有什么优化的想法吗?

这个SQL(mySQL)有什么优化的想法吗?,sql,mysql,Sql,Mysql,我知道最好的方法是不要在其他sql中包含任何sql,特别是复杂的sql,最好在查询后使用分析,但由于系统的构建方式,我宁愿只在一个查询中进行分析 下面是有问题的查询(“这是一个非常酷的查询”) 感谢所有能够解决这个问题的人:D(目前需要大约2分钟的实时时间)通常,将子查询移动到中是一个很大的改进。 不要使用逗号连接,正确连接和逗号连接的混合经常会中断。 我看到orders\U status表与任何其他表都没有关系。 添加适当的关系可以多次提高性能 分析查询性能并找到优化的位置。EXPLAIN的

我知道最好的方法是不要在其他sql中包含任何sql,特别是复杂的sql,最好在查询后使用分析,但由于系统的构建方式,我宁愿只在一个查询中进行分析

下面是有问题的查询(“这是一个非常酷的查询”)


感谢所有能够解决这个问题的人:D(目前需要大约2分钟的实时时间)

通常,将子查询移动到中是一个很大的改进。

不要使用逗号连接,正确连接和逗号连接的混合经常会中断。
我看到orders\U status表与任何其他表都没有关系。 添加适当的关系可以多次提高性能


分析查询性能并找到优化的位置。

EXPLAIN的输出显示,没有足够的索引使查询能够在不执行完整表扫描的情况下运行。最严重的问题是
orders\u products
表,该表在
orders\u id
列上没有合适的索引


您应该检查
JOIN
条件中使用的每一列是否有索引。仅此一点就非常有用。

您在各种表上有哪些索引?您是否对该查询进行了解释?这是由oscommerce进行的查询,oscommerce在myisam上有几个额外的字段,所有的表都有一个主键,主键是自动数字,它们之间没有任何关系。您有解释结果:感谢您的回答;)非常感谢,这是orders_的状态,它仍然来自一个老问题,我个人讨厌加入,现在我讨厌德国人,因为他们在WC击败了阿根廷(2006年、2010年,当然还有1990年)但现在是因为他们建立了oscommerce:D再次感谢你Naktibalda:D我知道我无论如何都要优化代码:p汉克斯迈克,我会检查:)
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