MySQL查询使服务器崩溃?

时间:2011-08-29 11:50:51

标签: mysql sql relation

在我的MySQL数据库中,我有两个表:'orders'和'orders_lines'。订单包含有关客户,订单日期等的信息。 Orders_lines包含有关产品的数据,如product_id,价格,数量,税率等。

我目前正在构建一个搜索页面,其中我想要返回包含特定产品的订单。例如,我想用product_id 2返回所有订单。我想到了一个类似的查询:

SELECT * FROM orders WHERE order_id IN ( SELECT order_id FROM orders_lines WHERE product_id = 2 )

但是当我今天早上执行查询时,我不得不调用托管服务提供商来终止MySQL进程,因为它很重要。从来没有听说过,也无法弄明白为什么,而且我现在非常绝望。订单表包含大约30.000行,orders_lines表包含大约38.000行。

我的数据库崩溃,如何更改查询以使其正常工作或如何实现显示包含特定产品的订单的目标的任何建议都是受欢迎的!

亲切的问候,

马亭

3 个答案:

答案 0 :(得分:2)

可以使用JOIN(和GROUP BY):

重写查询
SELECT o.* 
FROM orders o
  INNER JOIN order_lines ol
    ON o.order_id = ol.order_id
WHERE ol.product_id = 2
GROUP BY o.order_id

或者最好 - 只需要orders表的结果 - EXISTS

SELECT * 
FROM orders AS o
WHERE EXISTS  
      ( SELECT * 
        FROM orders_lines AS ol
        WHERE ol.product_id = 2 
          AND ol.order_id = o.order_id
      )

但请检查索引和EXPLAIN,然后再次运行可能导致服务器出错的内容。

答案 1 :(得分:1)

据我所知,内连接(又称自然连接)是这种情况下的最佳方式。 '在哪里.. N ..往往是一项昂贵的操作。

SELECT DISTINCT o.* FROM orders o
INNER JOIN orders_lines ol ON  o.order_id = ol.order_id 
WHERE ol.product_id = 2

答案 2 :(得分:1)

我不确定这是你需要的,无论如何尝试:

SELECT DISTINCT o.* FROM orders o
INNER JOIN order_lines ol
ON o.order_id = ol.order_id
WHERE ol.product_id = 2