
问题:
1 - Overhead是什么意思?当我单击MyISAM表上的"优化表"按钮时,开销和有效数据消失了.我想知道它对我的桌子做了什么?
2 - 我是否真的需要关注开销和有效价值?如何解决InnoDB表上的开销和有效问题?
修复InnoDB并不像点击按钮那样简单.MyISAM是.
在引擎盖下,OPTIMIZE TABLE将对名为mytb的MyISAM表执行此操作:
由于两个主要原因,OPTMIZE TABLE与InnoDB的工作方式不同:
原因#1:InnoDB存储布局
默认情况下,InnoDB已禁用innodb_file_per_table.所有InnoDB及其祖母都登陆ibdata1.运行OPTIMIZE TABLE会对名为mytb的InnoDB表执行以下操作:
不幸的是,用于收缩mytb的临时表被附加到ibdata1.ibdata1的即时增长!鉴于此,ibdata1永远不会缩小.更糟糕的是,ANALYZE TABLE无用(在原因#2中解释)
如果启用了innodb_file_per_table,则前四(4)步将起作用,因为数据不存储在ibdata1中,而是存储在名为mytb.ibd的外部表空间文件中.那会缩小.
原因#2:索引统计总是被重新计算
InnoDB无法有效存储索引统计信息.实际上,如果在mytb上运行ANALYZE TABLE,则会创建并存储统计信息.不幸的是,根据设计,InnoDB将深入到其索引的BTREE页面,猜测关键基数,并使用这些数字来准备MySQL查询优化器.这是一个持续的过程.实际上,ANALYZE TABLE是无用的,因为计算的索引统计信息会被针对该表执行的每个查询覆盖.我在2011年6月21日的DBA StackExchange中写到了这一点.
Percona在www.mysqlperformanceblog.com上对此进行了详细解释
至于MyISAM的开销,可以计算出这个数字.
对于MyISAM表,开销表示内部碎片.这在体验,INSERT,UPDATE和DELETE的表中非常常见,特别是如果您有BLOB数据或VARCHAR列.运行OPTIMIZE TABLE通过复制到临时表(自然不会复制空白空间)使这种碎片消失.
回到InnoDB,你如何有效地消除废物空间?您需要重新架构ibdata1以保留较少的信息.使用ibdata1,您有四种类型的数据:
您可以永久地永久地移动ibdata1中的表和索引.那些已经存放在ibdata1中的数据和索引呢?
按照我在2010年10月29日发布的InnoDB清理计划:Howto:清理一个mysql InnoDB存储引擎?
| 归档时间: |
|
| 查看次数: |
4833 次 |
| 最近记录: |