Внутреннее соединение SQL: БД застряла - PullRequest
1 голос
/ 20 марта 2010

Я задал этот вопрос несколько дней назад, но я не объяснил, чего именно хочу.Я задаю вопрос, лучше сформулированный снова: чтобы прояснить мою проблему, я добавил новую информацию:

Я получил базу данных MySQL с таблицами MyISAM.Две соответствующие таблицы:

* orders_products: orders_products_id, orders_id, product_id, product_name, product_price, product_name, product_model, final_price, ...
* products: products_id, manufacturers_id, ...

(для полной информации о таблицах см. Скриншоты продуктов ( Скриншот ) и скриншот orders_products ( Скриншот ))

Теперь я хочу вот что: - Получить все заказы, которые заказывали продукты, при этом они указали наименование продукта. 1. И название продукта, соответствующего данному заказу (с именем изготовителя = 1).Сгруппированные по заказам.

На данный момент я сделал следующее:

SELECT
op.orders_id,
p.products_id,
op.products_name,
op.products_price,
op.products_quantity
FROM orders_products op , products p 
INNER JOIN products
ON op.products_id = p.products_id
WHERE p.manufacturers_id = 1 AND
p.orders_id > 10000

p.orders_id> 10000 для тестирования, чтобы получить только несколько order_id.Но этот запрос требует много времени для выполнения, если он даже работает.Два раза завис сервер sql.Где ошибка?

Ответы [ 2 ]

2 голосов
/ 20 марта 2010
SELECT 
op.orders_id, 
p.products_id, 
op.products_name, 
op.products_price, 
op.products_quantity 
FROM orders_products op   
INNER JOIN products p
ON op.products_id = p.products_id 
WHERE p.manufacturers_id = 1 AND 
p.orders_id > 10000 

У вас были как неявные, так и явные объединения в таблице продуктов (обратите внимание, что никогда не использовать синтаксис неявного соединения, это очень плохая практика программирования) и, глядя на код, я подозреваю, что вы получаете перекрестное соединение.

1 голос
/ 20 марта 2010

Если у вас нет индексов, тогда выбор может генерировать много табличных сканирований.

Возможно, вы получаете очень большой набор результатов, который может заполнить временную область, что может объяснить застревание.

...