我的问题是:
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,如果第一个选项出现错误,我将不得不重写我的所有代码。
答案 0 :(得分:0)
如果您还没有索引,请在boxes.code
上添加索引。将8000条记录(4K + 4K)加入180,000条记录将受益于180K方面的指数。
另外,要明确并在SELECT语句中指定所需的字段。在生产用途查询中使用*是不好的形式,因为它鼓励不必考虑哪些字段(以及它们可能有多大),更不用说你的示例中有2个不同的表,barcodesa
和barcodesb
可能有不同的数据类型和列顺序,你正在UNIONing ....
答案 1 :(得分:0)
表现差异的原因......
第一个查询说...首先,将A UNIONed中的每条记录与B中的每条记录完全结合,然后将其加入代码中的框。联合没有要优化的索引。
通过显式应用您的SECOND查询实例,每个表在连接上单独进行优化(显然,每个性能为第二个是一个索引,但我会确保两个表都在“代码”列上有索引)。