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


9

我想知道OPTIMIZE TABLE tbl_name在MySQL Server中运行查询可以带来的[真正实用]好处。

我检查了一次,发现运行此命令后,下一个数据库命中可能花费很长时间,可能是由于碎片的重定位所致,但是随后的命中表现出某种性能,我不确定查询缓存是否能做到这一点与优化或仅优化一起完成此技巧。

如果可能的话,任何人都可以用一些实际的性能差异值来指导我,以便随着MySQL的使用在我们的项目中日益受到重视,我可以继续做下去。

Answers:


7

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

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

OPTIMIZE TABLE mydb.mytable;

请注意,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;

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

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

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

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

警告

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


感谢您的回复。从您的角度来看,我了解到我最好使用cron作业之类的服务来为我经常更新的表之一计划优化表,以便获得更好的性能。除此之外,我正在为此表使用InnoDB。这是一个更好的选择。另外,我发现在SQL Server中使用HASH联接可以提高查询性能,建议您为我解释一下,以及如何在MySQL中获得与此类似的联接。还请给我一个用于MySQL的SQL查询优化器[Windows7版本]。
Saravanan

@savaranan:我指的MySQL查询优化器是内置在MySQL中的内部查询器。顺便说一句,由于您要优化的表是InnoDB,因此可以跳过DISABLE KEYS和ENABLE KEYS步骤。同样,可以跳过ANALYZE TABLE,因为它在InnoDB表上完全没有用,因为InnoDB使用来自BTREE索引的页面通过近似逼近来重新计算其表基数,这就是所谓的索引潜水。
RolandoMySQLDBA 2011年

@savaranan:至于散列索引去,InnoDB的自适应性,具有哈希索引(dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html)。也有在模仿自己的哈希索引和基于“高性能MySQL的” 103-106页(碰撞处理好的建议amazon.com/dp/0596101716
RolandoMySQLDBA
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.