批量删除后,我需要重新索引mysql表吗?


10

我在MySQL中有一张表,每秒钟都有很多INSERT和SELECT。每天都会一次删除一些较旧的数据。删除后是否需要重新索引表?我想提高性能。有人可以建议一些技巧吗?使用“ innodb”作为存储引擎。我需要更改吗?我认为并发插入和选择更好。请提出您的建议。我需要重新编制索引吗?

提前致谢..

Answers:


10

使用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多版本”。


5

您可以重新索引表,甚至缩小表。但是,如果要延迟此类基于磁盘的维护,则至少应重新计算索引统计信息。

如果不重新计算索引统计信息,MySQL Query Optimizer可能会为查询EXPLAIN计划做出错误的选择。如果仍然存在不存在数据的统计信息,则可能会对SELECT产生不利影响。MyISAM和InnoDB都是如此。

您不必缩小表来计算索引统计信息,尽管它对于整体性能会更好。

要计算表中所有索引的统计信息,应运行

ANALYZE TABLE tablename;

您可以每天晚上这样做。它不会尝试对数据进行任何碎片整理或收缩。您可能每周可以运行一次OPTIMIZE TABLE tablename;ANALYZE TABLE tablename;在表的物理文件缩小后(.ibd对于InnoDB或.MYIMyISAM),这也将为您完成。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.