Mysql 分析+;优化InnoDB表
那时,当我大量使用MyISAM表时,我总是有一个运行的cronjobMysql 分析+;优化InnoDB表,mysql,innodb,Mysql,Innodb,那时,当我大量使用MyISAM表时,我总是有一个运行的cronjob ~# mysqlanalyze -o database 我知道MyISAM在某些方面从中受益,例如:碎片化等等 现在,当在大多数表都是InnoDB的数据库上运行相同的命令时,我想知道这是否对表“有任何好处”,偶尔这样做被认为是一种好的做法,或者它是否会适得其反。阅读大量: Table does not support optimize, doing recreate + analyze instead 就磁盘IO/CPU时
~# mysqlanalyze -o database
我知道MyISAM在某些方面从中受益,例如:碎片化等等
现在,当在大多数表都是InnoDB的数据库上运行相同的命令时,我想知道这是否对表“有任何好处”,偶尔这样做被认为是一种好的做法,或者它是否会适得其反。阅读大量:
Table does not support optimize, doing recreate + analyze instead
就磁盘IO/CPU时间而言,哪个听起来很贵
希望您能提供一些意见。说:
对于InnoDB表,OPTIMIZE TABLE
映射到ALTER TABLE。。。FORCE
,它重建表以更新索引统计信息并释放聚集索引中未使用的空间
在碎片太多的情况下,这确实有一些好处。如果使用innodb\u file\u per\u table
(这是最新版本中的默认设置),页面填充效率将更高,索引将重建,表占用的磁盘空间将减少
它确实需要时间,这取决于你桌子的大小。它将在运行时锁定桌子。它在运行时需要额外的磁盘空间,因为它会创建表的副本
通常不需要经常对InnoDB表执行优化表操作,但只有在对该表执行大量插入/更新/删除操作后,才能执行优化表操作,这可能会导致碎片
分析表
对InnoDB的影响要小得多。这不需要生成表的副本。这是一个只读操作,它只是从表中读取页面的随机样本,并使用该样本估计行数、行的平均大小,并更新有关索引的统计信息,以指导查询优化器。这在任何时候都是安全运行的,它会暂时锁定该表,但无论表的大小,这都不会更大。不用麻烦了。InnoDB几乎不需要分析
或优化
;除非你已经确定了需要,否则不要浪费时间
InnoDB表上的全文索引是一个例外。这样可以受益于删除索引
,然后添加索引
如果要从新数据“重新加载”表,则以下操作可避免停机:
CREATE TABLE new LIKE real;
load `new`
RENAME TABLE real TO old, new TO real; -- fast, atomic
DROP TABLE old;
(注意:如果存在外键
,上述技术可能会出现问题)我有一个每天运行的脚本,它会截断并重新填充一个全文InnoDB表。我注意到今天每个查询的性能已降至>1秒。一个快速的优化,它返回到0.4秒,所以脚本现在每天重新填充后运行优化。@Codemonkey-我在我的答案中添加了一些提示。你确定它会锁定表吗?您链接的文档显示:“表格重建由OPTIMIZE table触发,并由ALTER table在封面下执行。。。原力已到位。独占表锁仅在操作的准备阶段和提交阶段短暂获取。在准备阶段,更新元数据并创建中间表。在提交阶段,提交表元数据更改。“@RonanT你说得对,我做了一个实验,确认我可以在优化表的过程中更新表中的一行。它确实创建了一个新的物理文件,但它使用ALGORITHM=INPLACE。这意味着它将捕获在线alter日志文件中的更改,该文件具有固定的大小限制。由于这个限制,我通常忽略在线DDL,所以我忘记了它。