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是否足够智能以识别没有任何更改并且不需要写回磁盘?
无论哪种情况,MySQL 都必须读取行内容(无论是在磁盘上还是在缓存/缓冲池中)。无论哪种情况,MySQL 都会使用您的索引a作为起点。无论哪种情况,如果该行已经具有 的目标值,MySQL 都不会更新该行b。因此,我不认为 MySQL 会从该b<>b1子句中受益。
可以说,根据工作负载和数据集,如果将索引更改为和 的复合索引(按该顺序),查询(其中的b<>b1)可能会受益。在这种情况下,它不必访问磁盘(或检查缓存/缓冲池)来查找哪些行特别需要更新(即您可以利用您提到的 30% 和 60%)。话虽如此,现在您的索引将需要每次更新时进行更新,因此存在成本,尽管我怀疑这种权衡可能是值得的。aabb