【发布时间】:2016-05-10 20:20:06
【问题描述】:
我有一个大型主表,TableA 有 1200 万条记录。它的核心是:
表A: |--FieldA--|--FieldP--|--FieldS--|--FieldH--|--ValueField--|--FieldX--|
我从中创建了两个子表:
TableB 有大约 500 万条基于 FieldA、FieldP、FieldS 的唯一记录,我还推送了 Value,因为我不需要 FieldX。我
表B: |--FieldA--|--FieldP--|--FieldS--|--FieldH--|--ValueField
具有大约 200,000 条记录的 TableC 为每个唯一的 FieldH、FieldP、FieldS 提取了上限值和下限值字段:
表C: |--FieldP--|--FieldS--|--FieldH--|--MaxValue--|--MinValue--|
我最初忽略了将 FieldH 推送到 TableB 中,并且在此期间做了很多工作,因此无法重做该步骤。
我无法测试性能,所以只问以下问题,希望这是足够的信息:
要使用从 TableA 开始的 FieldH 数据更新 TableB,我有两个选择:
Update TableB as T1
Inner Join TableA as T2
On T1.FieldA=T2.FieldA
And T1.FieldP=T2.FieldP
And T2. FieldS=T2.FieldS
Set T1.FieldH=T2.FieldH
我在每个选择字段上都有索引。
这对我来说似乎是一个巨大的加入。
我的另一个选择是使用范围并通过更多计算进行更小的连接:
Update TableB as T1
Inner Join TableC as T2
On T1.ValueField>=T2.MinValue
And T1.ValueField<=T2.MaxValue
Set T1.FieldH=T2.FieldH
我在 value 字段上也有一个索引。
显然,在后一种情况下,它的优势是它的连接要小得多,但另一方面,我正在向每条记录添加数字计算。我对索引、连接或计算的内部工作原理了解得不够多,甚至无法对哪个更好做出有根据的猜测。
我希望我在这里提供了一张清晰的图片。尽量不要添加更多内容并使问题过于复杂,如果有任何添加数据可以帮助我很乐意提供/详细说明。
【问题讨论】:
-
您尝试过“复杂”连接吗? db 看起来并不难
-
@JuanCarlosOropeza 复杂是指计算吗?我还没有尝试过,因为到目前为止,这里的各种连接都需要很长时间,所以让任何一个 rip 变成一个猜谜游戏。从您的评论中可以看出,但是我可能高估了开销 >=
-
哦,我现在看到了。您想使用
Table A或Table C更新Table B。我认为你害怕使用 1200 万行Table A。首先你的意思是cant test performace?您应该能够运行EXPLAIN ANALYZEMySQL 这是您比较两个查询之间性能的唯一方法 -
我真的不认为选项 2) 可以给你想要的结果。
>= and <=条件...可能会返回多行,并且无法更新。\
标签: mysql join query-optimization