SQL内部加入:数据库卡住了

时间:2010-03-20 19:59:21

标签: sql mysql join myisam

我几天前提出这个问题,但我没有完全解释我想要什么。 我再问一下这个问题: 为了澄清我的问题,我添加了一些新信息:

我有一个带有MyISAM表的MySQL数据库。两个相关表格是:

* 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))

现在我想要的是: - 获取所有订购了products_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服务器停滞不前。哪里出错了?

2 个答案:

答案 0 :(得分: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 

你在产品表上有隐式和明确的连接(记下永远不会再使用隐式连接语法,这是一个非常糟糕的程序实践)并且查看代码,我怀疑你得到了交叉连接。

答案 1 :(得分:1)

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

可能是你要回到一个非常大的结果集,这可能会填满临时区域,这可以解释卡住。