MySQL запрос делает сбой сервера? - PullRequest
2 голосов
/ 29 августа 2011

В моей базе данных 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 ]

2 голосов
/ 29 августа 2011

Запрос может быть переписан с помощью JOINGROUP 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 голос
/ 29 августа 2011

Я не уверен, что это то, что вам нужно, в любом случае попробуйте:

SELECT DISTINCT o.* FROM orders o
INNER JOIN order_lines ol
ON o.order_id = ol.order_id
WHERE ol.product_id = 2
1 голос
/ 29 августа 2011

Насколько я знаю, внутреннее соединение (или естественное соединение) - лучший путь в таких случаях.«ГДЕ .. В .. как правило, дорогая операция.

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