2016-05-10 38 views
0

我有一个大的主表,TableA有1200万条记录。它的核心是:在特定情况下更快更新:使用等于或小于等于或大于等于>加入大于等于< - 并且<=

表A: | --FieldA-- | --FieldP-- | --FieldS-- | --FieldH-- | --ValueField-- | --FieldX- - |

我创建的两个子表:

表B基于FIELDA,FieldP,领域,我也推高值,因为我并不需要FieldX约500万唯一的记录。我

表B: | --FieldA-- | --FieldP-- | --FieldS-- | --FieldH-- | --ValueField

表C约20万人,其中记录拉到上并为每个独特FieldH,FieldP,场下的值字段:

表C: | --FieldP-- | --FieldS-- | --FieldH-- | --MaxValue-- | --MinValue- - |

我忽略了最初将FieldH推入TableB中,并且在此期间做了大量工作,因此无法重做该步骤。

没有办法,我来测试性能,因此只是问以下问题希望这是足够的信息:

与它开始与FieldH数据更新表B TableA中我有两个选择:

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 

我对值字段的索引以及。

显然在后一种情况下,优点是它是一个更小的连接,但另一方面,我将数字计算添加到每条记录。我对于索引,连接或计算的内部工作知之甚少,甚至不知道哪个更好。

我希望我在这里提供了一个清晰的图片。试着不要添加更多并且过度复杂的问题,如果有任何添加数据会帮助我很乐意提供/详细说明。

+0

您是否尝试过“复杂”连接?看起来真的很难为db –

+0

@JuanCarlosOropeza复杂你的意思是计算?到目前为止,我还没有尝试各种各样的加入都花了相当长的时间,所以让任何一个rip变成一个猜谜游戏。它从你的评论看来,但我可能高估了开销> = <=将要添加。 – user3649739

+0

哦,我现在看到它。你想用'表A'或'表C'更新'表B'。我想你害怕使用一个1200万行“表A”。首先你的意思是“不能测试性能”?你应该可以运行'EXPLAIN ANALYSE' [** MySQL **](http://dba.stackexchange.com/questions/15371/how-do-i-get-the-execution-plan-for-a-查看)这是你可以比较两个查询之间的性能的唯一方法 –

回答

0

我将把你这个问题(这是我最后回答):

Faster Update in specific case: Join Large with equals or smaller with >- and <=

这是这一次的产物。我意识到这不是> = < =但是我的索引本身,特别是我需要创建一个复合索引并让MySql选择它。所以解决了这个问题。长话短说,因为我需要连接两个带连接的varchar字段的大表,我制作了一个中间表,并使用这些ID来连接。如果您需要详细信息,请参阅上面的链接。

最后,即使使用> = < =,它的工作效果也很好,实际上它最终在500万条记录上做了52k次更新,超过一分钟(这是每个记录需要10秒钟的时间)前)。