2010-03-20 65 views
1

前几天我遇到了这个问题,但我没有完全解释我想要什么。 我问这个问题再次提出更好: 为了澄清我的问题,我添加了一些新的信息:SQL内部加入:数据库卡住

我有一个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, ... 

(有关表格的完整信息见截图的产品(Screenshot)和截图orders_products(Screenshot))

现在,我想是这样的: - 获取谁下令所有订单与manufacturer_id = 1的产品。以及此订单的产品的产品名称(与manufacturer_id = 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服务器陷入困境。错误在哪里?

+0

小彩钻对任何不了解该工具的人都没有任何意义。确切的DDL语句会更好地显示。 – 2010-03-20 20:02:53

回答

2
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 

你有隐式和显式联接Products表(记永远不会再使用隐式连接语法,这是一个非常糟糕的编程与实践),并查看代码,我怀疑你都拿到交叉连接。

+0

非常感谢。而已。 =) – SurfingCat 2010-03-20 20:14:19

1

如果您没有任何索引,那么select可能会生成许多表扫描。

这可能是你回来了一个非常大的结果集,可能会填补临时区域,这可能会解释卡住。