我正在尝试在两个非常大的表(数百万条记录)之间进行更新
Update TableA as T1
Inner Join TableB as T2
On T1.Field1=T2.Field1
And T1.Value >= T2.MinValue
And T1.Value <= T2.MaxValue
Set T1.Field2=T2.Field2
我在两个表中分别对所有字段都有索引,包括值字段。它们都是Normal / BTree(默认)。
有没有更好的方法来索引值字段以获得更好的性能?它增加了一个巨大的开销,否则(使用只是=)一个非常快速的更新。我的第一次测试也是3分钟更新25条记录,我有500万条更新。
答案 0 :(得分:1)
通常,每个表只能有一个索引用于特定的WHERE
子句。因此,如果它使用Field1
上的索引,它将无法使用Value
上的索引,反之亦然。解决方案是使用复合索引:
ALTER TABLE TableA ADD INDEX (Field1, Value);
由于多列上的索引实际上是列的任何前缀集的索引,因此您可以在添加此索引时删除Field1
上的单个索引。但是,如果其他查询需要,您仍应将个人索引保留在Value
。