我有一个超过10 ^ 7行的MyISAM表。向其添加数据时,我必须在最后更新~10行。删除它们然后插入新的更快,还是更新这些行更快?应更新的数据不是索引的一部分。那么索引/数据碎片呢
答案 0 :(得分:21)
UPDATE
要快得多。
当您UPDATE
时,表记录刚刚被新数据重写。
当您DELETE
时,应该更新索引(记住,您删除整行,而不仅仅是您需要修改的列),并且可以移动数据块(如果您达到PCTFREE
限制)
所有这些必须在INSERT
再次完成。
这就是你应该总是使用
的原因INSERT ... ON DUPLICATE KEY UPDATE
而不是REPLACE
。
前一个是关键违规时的UPDATE
操作,而后一个是DELETE
/ INSERT
。
答案 1 :(得分:4)
更新速度更快。您还可以使用INSERT ON DUPLICATE KEY UPDATE
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
有关详细信息,请参阅更新documentation
答案 2 :(得分:2)
为了提高性能,我不考虑删除或更新数据,而是考虑进行分区。
http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html
这样您就可以保留历史数据而不会降低性能。
答案 3 :(得分:1)
逻辑DELETE + ADD = 2个动作,UPDATE = 1个动作。同时删除和添加新的更改会在auto_increment上记录ID,因此如果这些记录的关系会被破坏,或者也需要更新。我会去更新。
答案 4 :(得分:0)
使用更新,其中Column ='something'应该使用索引,只要搜索条件在索引中(无论是搜索还是扫描都是完全不同的问题)。
如果您经常进行这些更新但是没有在条件列上有索引,我建议您在使用的列上创建索引。这应该有助于加快速度。