2012-01-28 83 views
2

我的问题是这样的:MySQL的子查询与JOIN性能差

select * from 
    (
    select * from barcodesA 
    UNION ALL 
    select * from barcodesB 
    ) 
    as barcodesTOTAL, boxes 
where barcodesTotal.code=boxes.code; 

表barcodesA有4000项 表barcodesB有4000项 表盒有一个像180.000项

它需要30秒proccess的查询。

另一个有问题的查询:

select * from 
    viewBarcodesTotal, boxes 
where barcodesTotal.code=boxes.code; 

viewBarcodesTotal包含UNION ALL从两个条形码表。它也需要永远。

同时,

 select * from barcodesA , boxes where barcodesA.code=boxes.code 
     UNION ALL 
     select * from barcodesB , boxes where barcodesB.code=boxes.code 

这其中需要<1秒。

问题显然是为什么?是我的代码被窃听?是mysql窃听?

我必须从访问迁移到MySQL,我将不得不重写所有我的代码,如果第一个选项在窃听。

+0

简而言之:子查询很慢,尽可能避免它们。 – Polynomial 2012-01-28 22:22:40

+1

您可能需要在查询上运行EXPLAIN并在您的问题中包含该输出。否则,你有代码字段上的索引吗?你真的需要获得所有的数据或一个子集(基于条件)就足够了吗? – 2012-01-28 22:33:56

回答

0

如果您还没有,请在boxes.code上添加索引。将180条记录(4K + 4K)加入180,000将受益于180K方程的索引。

另外,请明确指出您在SELECT语句中需要的字段。在生产用途查询中使用*是不好的形式,因为它鼓励您不必考虑哪些字段(以及它们可能有多大),更不用说在示例中有两个不同的表格,barcodesabarcodesb可能有潜在的不同的数据类型和你UNIONing列订单....

+0

条码A,条码A包含与衣服相关的条码。盒子包含与盒​​子相关的20个条形码。我应该把索引放在哪里?此外,我不使用选择*,我只是想简化它可以更轻松地阅读。 – Fran 2012-01-28 23:21:17

0

的性能差异的原因...

第一个查询说...首先,做好每一个记录的完整的工会进行了将B中的每条记录联合起来,然后将其加入代码框中。工会没有索引要优化。通过明确地应用你的SECOND查询实例,每个表在连接上单独进行了优化(显然每个表现都有一个索引,但是我会确保这两个表都有“代码”列上的索引)。

+0

我该如何检查索引? 它应该是什么列? 记住这个表格: 条形码> barcode,seasson,型号,颜色 barcodesB> barcde,seasson,model,color .------。 :::::例如::::: 84232323232,1,100,225 盒> boxNumber,条码,细节 :::::例如::::: 000000000001,84232323232,无论 – Fran 2012-01-28 23:43:41

+0

@Fran ,http://dev.mysql.com/doc/refman/5.0/en/getting-information.html显示“Describe Table {yourTable}”命令(其中包括) – DRapp 2012-01-28 23:48:57

+0

您需要屏幕截图吗? – Fran 2012-01-29 09:41:22