在 MySQL DB Server 中运行 OPTIMIZE TABLE 查询的好处

Sar*_*nan 9 mysql optimization

我想知道通过OPTIMIZE TABLE tbl_name在 MySQL 服务器中运行查询可以获得哪些好处[真正实用] 。

我检查了一次,发现运行后,下一次 DB 命中需要很长时间,可能是因为片段的重定位左右,但随后的命中显示了某种性能,我不确定查询缓存是否执行此技巧单独使用优化或优化就可以做到这一点。

如果可能的话,任何人都可以指导我一些实际的性能差异值,以便我可以进一步研究,因为在我们的项目中使用 MySQL 越来越重要。

Rol*_*DBA 7

请记住,OPTIMIZE TABLE不执行碎片整理。在内部,OPTIMIZE TABLE执行多项操作(将数据复制到临时文件、重新创建索引、重新计算索引统计信息)。事实上,我的例子可以手动执行,如图所示。

示例:如果您优化mydb.mytable,请输入以下命令:

OPTIMIZE TABLE mydb.mytable;
Run Code Online (Sandbox Code Playgroud)

请注意,mysql 在后台执行以下操作:

CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;
Run Code Online (Sandbox Code Playgroud)

这对于经历大量 UPDATE 和 DELETE 的表非常有用

执行此操作可以完成两件事

  1. 防止 mysql 查看表中的片段以尝试将数据加载到正确大小的片段中。消除这些碎片将减少此操作。

  2. 重新计算索引统计信息有助于 MySQL 查询优化器构建更好的 EXPLAIN 计划。否则,查询的执行时间可能会变差,因为 MySQL 查询优化器决定对 EXPLAIN 计划进行错误的猜测。这将是具有大量 UPDATE 和 DELETE 的表的明确症状。

警告

关于缓存,由于进行了全表扫描,缓存很快就会出现。对于 MyISAM 索引页流入和流出 MyISAM 密钥缓存。对于 InnoDB,数据和索引页流入和流出 InnoDB 缓冲池。