我有一个包含12列的mysql表,一个主键和两个唯一键。我在这个表中有或多或少86000行/记录。 我使用这个mysql代码:
INSERT INTO table (col2,col3,-------col12) VALUES ($val2,$val3,----------$val12) ON DUPLICATE KEY UPDATE col2=VALUES($val2), col3=VALUES($val3),----------------col12=VALUES($val12)
当我从cpanel phpmyadmin查看此表的结构时,我可以在表的索引信息下方看到“Optimize Table”链接。如果单击该链接,表格将进行优化。
但我的问题是为什么我在这个表中经常看到'优化表'链接(在3/4天内出现),而这个数据库的其他表没有显示优化表链接(它们显示了每月或每两个月或更长时间连接一次。)
由于我没有删除此表行,只是插入并且如果找到重复键,只是更新,那么为什么需要如此频繁地进行优化?
答案 0 :(得分:1)
简答:切换到Innodb
MyISAM存储引擎将BTree用于索引并创建索引文件。每次插入大量数据时,这些索引都会发生变化,这就是为什么需要优化表来重新组织索引并重新获得一些空间的原因。
与Innodb相比,MyISAM的索引机制占用更多空间。
Innodb在MyISAM方面还有很多其他优势,但这是另一个话题。
答案 1 :(得分:1)
我将解释插入记录如何影响MyISAM表并解释优化的作用,因此您将理解为什么插入记录会产生如此大的影响。
数据强>
使用MyISAM,当您插入记录时,数据只会附加到数据文件的末尾。
在MyISAM表上运行optimize会对数据进行defrags,对其进行物理重新排序以匹配主键索引的顺序。这样可以加快顺序记录读取(和表扫描)。
<强>索引强>
插入记录还会向索引中的B树节点添加叶子。如果节点填满,则必须将其拆分,实际上至少重建索引的该页面。
优化MyISAM表时,索引会变平,在重建索引页面之前可以进行更多扩展(插入)。这个更平坦的索引也加快了搜索速度。
<强>统计强>
MySQL还存储有关密钥分发的每个索引的统计信息,查询优化器使用此信息来帮助制定良好的执行计划。插入(或删除)许多记录会导致这些统计信息过时。
优化MySQL在碎片整理和重建索引后重新计算表的统计信息。
<强> VS。附加强>
当您附加数据(添加具有更高主键值的记录,例如使用auto_increment)时,该数据不需要在以后进行碎片整理,因为它已经处于正确的物理顺序。此外,当将(顺序插入)附加到索引中时,节点保持平坦,因此也无法在那里进行重建。
<强> VS。 InnoDB的强>
InnoDB在插入时会遇到相同的问题,但由于数据由于其聚簇索引而按主键保持顺序,因此您需要预先设置(在插入时)以保持数据的顺序,而不是以后必须进行碎片整理。尽管如此,优化InnoDB确实通过扁平化B树节点并释放未使用(已删除)密钥来优化数据,从而改善顺序读取(表扫描),二级索引与MyISAM中的索引类似,因此它们可以重建为扁平化他们出去了。
<强>结论强>
我不是想要坚持使用MyISAM。由于聚簇索引,InnoDB具有卓越的读取性能,并且由于记录级别锁定与MyISAM的表锁定(假设并发用户),因此具有更好的更新和附加性能。此外,InnoDB还有ACID。
不过,我的目标是回答你的直接问题并提供一些技术细节,而不是猜想和传闻。
两个数据库存储引擎都不会自动优化。