Sha*_*e N 6 mysql optimization
我有一个每周脚本,它从我们的实时数据库移动数据并将其放入我们的存档数据库,然后删除它刚刚从实时数据库存档的数据.因为它是一个不错的大小删除(大约10%的表被修剪),我想我应该在此删除后运行OPTIMIZE TABLE.
但是,我从mysql文档中读到这个,我不知道如何解释它:http: //dev.mysql.com/doc/refman/5.1/en/optimize-table.html
"如果删除了表的大部分,或者对具有可变长度行的表(具有VARCHAR,VARBINARY,BLOB或TEXT列的表)进行了许多更改,则应使用OPTIMIZE TABLE.保留已删除的行在链表中,后续INSERT操作重用旧行位置.您可以使用OPTIMIZE TABLE回收未使用的空间并对数据文件进行碎片整理.
第一句对我来说是模棱两可的.这是否意味着您应该在以下情况下运行它:A)您已删除了具有可变长度行的表的大部分,或者如果您对具有可变长度行的表进行了许多更改,或者B)您删除了大部分任何表或者如果您对具有可变长度行的表进行了许多更改
那有意义吗?所以如果我的表没有VAR列,我还需要运行吗?
虽然我们正在研究这个主题 - 是否有任何指示器告诉我OPTIMIZE呼叫表已经成熟?
此外,我读到这篇http://www.xaprb.com/blog/2010/02/07/how-often-should-you-use-optimize-table/,其中说只运行OPTIMIZE表对主键很有用.如果我的大部分选择来自其他指数,我是否只是在拥有代理键的表上浪费精力?
非常感谢!
在您的情况下,我不认为定期优化表格会产生明显的变化。
首先,您对文档的第二种解释 (B) 是正确的 - “如果您删除了任何表的大部分,或者如果您对具有可变长度行的表进行了许多更改。”
如果您的表没有 VAR 列,则每条记录,无论其包含什么数据,都会在表中占用完全相同的空间量。如果从表中删除一条记录,并且数据库选择重用存储前一条记录的确切区域,则可以这样做,而不会浪费任何空间或使数据碎片化。
至于 OPTIMIZE 是否只提高使用主键索引的查询的性能,这个答案几乎肯定会根据所使用的存储引擎而有所不同,恐怕我无法回答这个问题。
然而,说到存储引擎,如果您最终使用 OPTIMIZE,请注意它不喜欢在 InnoDB 表上运行,因此该命令映射到 ALTER 并重建表,这可能是一个更昂贵的操作。无论哪种方式,表都会在优化期间锁定,因此运行它时要非常小心。