mysql子查询与JOIN性能不佳

时间:2012-01-28 22:21:05

标签: mysql performance join subquery

我的问题是:

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

表条形码A有4000个条目 表格条形码B有4000个条目 表格框有180.000个条目

处理查询需要30秒。

另一个有问题的查询:

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,如果第一个选项出现错误,我将不得不重写我的所有代码。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

表现差异的原因......

第一个查询说...首先,将A UNIONed中的每条记录与B中的每条记录完全结合,然后将其加入代码中的框。联合没有要优化的索引。

通过显式应用您的SECOND查询实例,每个表在连接上单独进行优化(显然,每个性能为第二个是一个索引,但我会确保两个表都在“代码”列上有索引)。