Answers:
使用InnoDB时是否需要优化表?是和否,这取决于您的工作负载以及是否遇到性能问题。
来自MySQL文档的无耻复制粘贴:
对于InnoDB表,OPTIMIZE TABLE映射到ALTER TABLE,ALTER TABLE重建表以更新索引统计信息并释放聚簇索引中未使用的空间。在InnoDB表上运行时,这将显示在OPTIMIZE TABLE的输出中,如下所示:
mysql> OPTIMIZE TABLE foo; +----------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------+----------+----------+-------------------------------------------------------------------+ | test.foo | optimize | note | Table does not support optimize, doing recreate + analyze instead | | test.foo | optimize | status | OK | +----------+----------+----------+-------------------------------------------------------------------+
此操作不使用快速索引创建。创建辅助索引的效率不高,因为键是按照它们在主键中出现的顺序插入的。请参见第14.14.6节“快速创建索引的限制”。
InnoDB使用页面分配方法存储数据,并且不会像传统存储引擎(例如MyISAM)那样遭受碎片化的困扰。在考虑是否运行优化时,请考虑服务器将处理的事务工作量:
预期会有某种程度的碎片。InnoDB只填满93%的页面,为更新留出空间,而不必拆分页面。
删除操作可能会留下空白,从而使页面无法充满所需的空间,这可能值得优化表。
当有足够的空间可用时,对行的更新通常会重写同一页中的数据,具体取决于数据类型和行格式。请参见第14.10.5节“ InnoDB表的压缩方式”和第14.12.1节“ InnoDB行存储概述”。
由于InnoDB通过其MVCC机制保留了相同数据的多个版本,因此高并发工作负载可能会随着时间的推移在索引中留下空白。请参见第14.5.12节“ InnoDB多版本”。
您可以重新索引表,甚至缩小表。但是,如果要延迟此类基于磁盘的维护,则至少应重新计算索引统计信息。
如果不重新计算索引统计信息,MySQL Query Optimizer可能会为查询EXPLAIN计划做出错误的选择。如果仍然存在不存在数据的统计信息,则可能会对SELECT产生不利影响。MyISAM和InnoDB都是如此。
您不必缩小表来计算索引统计信息,尽管它对于整体性能会更好。
要计算表中所有索引的统计信息,应运行
ANALYZE TABLE tablename;
您可以每天晚上这样做。它不会尝试对数据进行任何碎片整理或收缩。您可能每周可以运行一次OPTIMIZE TABLE tablename;
。ANALYZE TABLE tablename;
在表的物理文件缩小后(.ibd
对于InnoDB或.MYI
MyISAM),这也将为您完成。
在InnoDB上几乎不需要OPTIMIZE TABLE。
您是否根据年龄删除记录?如果是这样,您可以使用PARTITIONing和DROP PARTITION使“批量删除”基本上免费。此处有更多详细信息:http : //mysql.rjweb.org/doc.php/partitionmaint