MySql UPDATE优化?

Gho*_*der 5 mysql database performance

假设我有一个包含两列A和B的表.在A列上有一个索引但在B列上没有.我想发出数百万个查询,如:

UPDATE t1 SET b=b1 WHERE a=a1;
UPDATE t1 SET b=b2 WHERE a=a2;
....
Run Code Online (Sandbox Code Playgroud)

对应于每个唯一值,有1到100,000行a.平均而言,它大约是100.

对于每个更新语句,平均60%的行不会更改,因为这些行b已经具有所需的值.对于30%的更新,不会更改任何匹配的行.

使用这样的语句是否有意义?

UPDATE t1 SET b=b1 WHERE a=a1 AND b<>b1;
Run Code Online (Sandbox Code Playgroud)

它是否会通过消除对磁盘的不必要的回写来加速该过程,或者Mysql 5是否足够智能以识别没有任何更改并且不需要写回磁盘?

Rie*_*sio 4

无论哪种情况,MySQL 都必须读取行内容(无论是在磁盘上还是在缓存/缓冲池中)。无论哪种情况,MySQL 都会使用您的索引a作为起点。无论哪种情况,如果该行已经具有 的目标值,MySQL 都不会更新该行b。因此,我不认为 MySQL 会从该b<>b1子句中受益。

可以说,根据工作负载和数据集,如果将索引更改为和 的复合索引(按该顺序),查询(其中的b<>b1可能会受益。在这种情况下,它不必访问磁盘(或检查缓存/缓冲池)来查找哪些行特别需要更新(即您可以利用您提到的 30% 和 60%)。话虽如此,现在您的索引将需要每次更新时进行更新,因此存在成本,尽管我怀疑这种权衡可能是值得的。aabb