2011-01-13 78 views
5

让我们假设我有两列A和B.表上有一列的索引,但不能在B列 我要发出数百万查询:MySql更新优化?

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

有从任何地方1至100,000行对应于每个唯一值a。平均而言,这是100左右

有关行的平均60%的每个更新语句不会为这些行b因为改变已经拥有所需的值。对于30%的更新,没有匹配的行将被更改。

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

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

将通过消除不必要的回写到磁盘加速过程还是Mysql的5聪明地认识到,什么都没有改变,也没有必要写回磁盘?

回答

4

在这两种情况下,MySQL将要读的行内容(无论是在磁盘上还是在缓存/缓冲池中)。无论哪种情况,MySQL都会使用您的索引a作为起点。在任何一种情况下,如果MySQL已经具有b的目标值,MySQL将不更新该行。因此,我不认为MySQL可以通过b<>b1条款获益。

可以说,这取决于工作负载和数据集(在它与b<>b1)查询威力的好处,如果你改变你的a指数上ab(按顺序)的化合物指标。在这种情况下,它不必打开磁盘(或检查缓存/缓冲池),以找出哪些行需要更新(即,您将利用所提及的30%和60%)具体为。话虽如此,现在你的索引将需要在每个b更新的更新,所以有成本的,虽然我怀疑的权衡可能是值得的。

0

您应该添加额外的过滤器。如果Mysql相同,Mysql足够聪明,无需更新值,但最好消除此检查。您可以通过查看有多少行受到查询“影响”来确认。

0

我一直在想用CASE

update t1 
set b= 
    case a 
    when a=a1 then b1 
    when a=a2 then b2 
    when a=a3 then b3 ... 
    end; 

希望这个有用的多次更新到单个更新结合起来,如果它可怕的慢,请包括交代