2009-05-05 65 views
8

我有一个超过10^7行的MyISAM表。向它添加数据时,我必须在最后更新~10行。删除它们然后插入新的更快,还是更快地更新这些行?应该更新的数据不是索引的一部分。怎么样索引/数据碎片MySQL的性能删除或更新?

回答

20

UPDATE要快得多。

当你UPDATE,表记录正在被重新写入新的数据。

当你DELETE,该指标应更新(请记住,你删除整行,不仅需要修改的列)和数据块可以移动(如果你打的PCTFREE限制)

和所有这必须在INSERT上再次完成。

这就是为什么你应该总是使用

INSERT ... ON DUPLICATE KEY UPDATE 

,而不是REPLACE

前一个是UPDATE在违规情况下的操作,而后一个是DELETE/INSERT

3

更新更快。您还可以使用INSERT对重复密钥更新

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

有关详细信息,读取,更新documentation

+0

伙计,你在3分钟的时间里速度更快,这是多么的不公正?! ) – 2014-05-14 10:52:48

1

按道理DELETE + ADD = 2的操作,UPDATE = 1分的动作。同样,删除和添加新更改会记录auto_increment上的ID,因此如果这些记录的关系会被破坏,或者需要更新。我会去更新。

0

使用更新其中Column ='something'应该使用索引,只要搜索条件在索引中(无论它是查找还是扫描都是完全不同的问题)。

如果您正在做这些更新很多,但没有在标准列上有索引,我会建议在您使用的列上创建一个索引。这应该有助于加快速度。