【问题标题】:Faster Update in specific case: Join Large with equals or smaller with >- and <=在特定情况下更快的更新:用 >- 和 <= 加入等号或更小的大号
【发布时间】: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 ATable C 更新Table B。我认为你害怕使用 1200 万行 Table A。首先你的意思是cant test performace?您应该能够运行 EXPLAIN ANALYZE MySQL 这是您比较两个查询之间性能的唯一方法
  • 我真的不认为选项 2) 可以给你想要的结果。 &gt;= and &lt;= 条件...可能会返回多行,并且无法更新。\

标签: mysql join query-optimization


【解决方案1】:

我会向您推荐这个问题(我终于回答了):

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

这是这个的产物。我意识到这不是 >=

长话短说,因为我需要使用串联的 varchar 字段连接两个大表,所以我制作了一个中间表并使用这些 ID 来代替。如果您需要详细信息,请参阅上面的链接。

最终,即使使用 >=

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多