MySql UPDATE优化?

MySql UPDATE优化?,第1张

概述假设我有一个包含两列A和B的表.在A列上有一个索引但在B列上没有.我想发布数百万条查询,例如:UPDATE t1 SET b=b1 WHERE a=a1; UPDATE t1 SET b=b2 WHERE a=a2; .... 对应于a的每个唯一值,有1到100,000行.平均而言,它大约是100.对于每个更新语句,平均60%的行不会被更改,因为对于这些行,

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

UPDATE t1 SET b=b1 WHERE a=a1;UPDATE t1 SET b=b2 WHERE a=a2;....

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

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

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

UPDATE t1 SET b=b1 WHERE a=a1 AND b<>b1;

它是否会通过消除对磁盘的不必要的回写来加速该过程,或者MysqL 5是否足够智能以识别没有任何更改并且不需要写回磁盘?最佳答案在任何一种情况下,MysqL都必须读取行内容(无论是在磁盘上还是在缓存/缓冲池中).在任何一种情况下,MysqL都会使用你的索引作为起点.在任何一种情况下,如果已经具有b的目标值,MysqL将不会更新该行.因此,我没有看到MysqL有什么方法可以从b<> b1子句中受益.

可以说,根据工作负载和数据集,如果您将a上的索引更改为a和b上的复合索引(按此顺序),则查询(其中b<> b1)可能会受益.在这种情况下,它不必命中磁盘(或检查缓存/缓冲池)以查找特别需要更新的行(即,您可以利用您提到的30%和60%).话虽如此,现在你的索引将需要更新b上的每个更新,所以有一个成本,虽然我怀疑权衡可能是值得的. 总结

以上是内存溢出为你收集整理的MySql UPDATE优化?全部内容,希望文章能够帮你解决MySql UPDATE优化?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1168655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存