Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 分析+;优化InnoDB表_Mysql_Innodb - Fatal编程技术网

Mysql 分析+;优化InnoDB表

Mysql 分析+;优化InnoDB表,mysql,innodb,Mysql,Innodb,那时,当我大量使用MyISAM表时,我总是有一个运行的cronjob ~# mysqlanalyze -o database 我知道MyISAM在某些方面从中受益,例如:碎片化等等 现在,当在大多数表都是InnoDB的数据库上运行相同的命令时,我想知道这是否对表“有任何好处”,偶尔这样做被认为是一种好的做法,或者它是否会适得其反。阅读大量: Table does not support optimize, doing recreate + analyze instead 就磁盘IO/CPU时

那时,当我大量使用MyISAM表时,我总是有一个运行的cronjob

~# 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,所以我忘记了它。