MySql查询需要永远

时间:2009-11-25 18:54:31

标签: mysql

嗨我正在进行查询以获取一些产品信息,但是有一些奇怪的事情发生,第一个查询快速返回结果集(.1272s),但第二个(注意我刚刚添加了1列)需要永远完成( 28-35s),有谁知道发生了什么?

查询1

SELECT
p.partnumberp,
p.model,
p.descriptionsmall,
p.brandname,
sum(remainderint) stockint
from
inventario_dbo.inventoryindetails ind
left join purchaseorders.product p on (p.partnumberp = ind.partnumberp)
left join inventario_dbo.inventoryin ins on (ins.inventoryinid= ind.inventoryinid)
group by partnumberp, projectid

查询2

SELECT
p.partnumberp,
p.model,
p.descriptionsmall,
p.brandname,
p.descriptiondetail,
sum(remainderint) stockint
from
inventario_dbo.inventoryindetails inda
left join purchaseorders.product p on (p.partnumberp = inda.partnumberp)
left join inventario_dbo.inventoryin ins on (ins.inventoryinid= inda.inventoryinid)
group by partnumberp, projectid

2 个答案:

答案 0 :(得分:2)

除非使用聚合函数,否则不应按某些列进行分组,然后选择其他列。只有p.partnumberp和sum(remainingint)才有意义。你正在做一个巨大的连接并选择,然后大多数行的结果最终都会被丢弃。

您可以通过先执行内部选择然后将其连接到其余表来更快地进行查询,以获得最后几列的最终结果。

内部选择应该如下所示:

select p.partnumberp, projectid, sum(remainderint) stockint
    from inventario_dbo.inventoryindetails ind
    left join purchaseorders.product p on (p.partnumberp = ind.partnumberp)
    left join inventario_dbo.inventoryin ins on (ins.inventoryinid = ind.inventoryinid)
    group by partnumberp, projectid

加入后:

select T1.partnumberp, T1.projectid, p2.model, p2.descriptionsmall, p2.brandname, T1.stockint
from
    (select p.partnumberp, projectid, sum(remainderint) stockint
        from inventario_dbo.inventoryindetails ind
        left join purchaseorders.product p on (p.partnumberp = ind.partnumberp)
        left join inventario_dbo.inventoryin ins on (ins.inventoryinid = ind.inventoryinid)
        group by partnumberp, projectid) T1
    left join purchaseorders.product p2 on (p2.partnumberp = T1.partnumberp)

答案 1 :(得分:1)

descriptiondetail是一个非常大的专栏吗?听起来它可能是基于其名称的其他字段的大量文本,因此可能只需要花费更多的时间从磁盘读取,但是如果您可以发布purchaseorders.product表的架构细节或者可能是该列的平均长度将有所帮助。

其他方面我会尝试运行几次查询并看到你始终获得相同的时间结果。可能只是在得到较慢结果时加载到数据库服务器上。