这周阿里集团DBA内部分享时,支付宝的黄忠同学提了一个问题,关于InnoDB索引page 的利用率。
page利用率
主要是指btee里面每个page的使用被使用的空间大小。我们知道InnoDB默认一个page大小是16k。但实际使用情况不会总用满
我们定义为所有page的总使用字节除以总字节数。
在理论分析之前,我们要先弄个工具,查一下。
实例统计
写了一个简单的工具,读ibd文件上的每个page,算出每个page的实际使用字节,可以得到利用率。
我们找了线上一个库来模拟。表中有1个自增主键和3个非聚簇索引。不影响结论地简化为如下:
CREATE TABLE `ctu_factor_risk_99_03` (
`seq_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`a` varchar(32) DEFAULT NULL,
`b` varchar(32) DEFAULT NULL,
`c` varchar(32) DEFAULT NULL, KEY a (a),
KEY bc (b,c),
KEY cb (c,b),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
插入数据中a,b,c均为长度为30字节的随机字符串。
显然主键和其他索引应该分开统计。统计结果发现,主键page利用率71%,其他索引利用率约52%。
简单分析
上面的结果很好理解。因为按照主键递增顺序插入数据,因此主键上数据“紧凑”。 而其他三个索引,则都是随机更新,需要不停地作索引节点分裂。
如何提升磁盘空间利用率
回到最开始的问题。其实我们关心的,是InnoDB为了保存相同的数据,用了多少空间。所以我们的问题变成,存储相同的数据,如何让占用的磁盘空间更小。
有一个很直观的结论。把这些索引删了重建,必然会减少空间消耗。因为这个操作之后,在新的数据插入之前,这些索引也变成“紧凑的”。
再建了一个与cb相同的索引,再跑,利用率居然高达98%。这个原理大家应该都知道了,只是量化一下而已。
工具附后, 用法 ./ibd_used tb.ibd N1 N2 >/tmp/r 最后几行为各个索引的利用率统计值
分享到:
相关推荐
- **填充因子**:B+树通过设置填充因子来控制节点的空间利用率,以减少节点分裂的频率。填充因子越高,节点的利用率就越高,但过高的填充因子可能导致更多的节点分裂,进而增加磁盘I/O操作。 - **应用场景**:B+树...
- **利用率**:在考虑系统性能时,还需要关注系统的利用率,即系统资源(如CPU、内存等)被利用的程度。高利用率可能导致响应时间增加。 #### 运行环境的重要性 MySQL与InnoDB的性能受到运行环境的直接影响,主要...
InnoDB 的设计目标是处理大容量数据库系统,它的 CPU 利用率是其它基于磁盘的关系数据库引擎所不能比的。 在技术上,InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 在主内存中建立其专用的缓冲池用于高速...
【MySQL InnoDB 存储引擎表空间...了解并正确配置InnoDB的表空间模式对于数据库管理员来说至关重要,它直接影响到数据库的性能、可维护性和资源利用率。根据实际需求选择合适的表空间模式,可以优化数据库的整体运作。
在共享表空间模式下,所有数据和索引都存放在ibdata1文件中,这简化了管理,但可能导致空间利用率不高。而在独立表空间模式下,每个表的数据和索引存储在一个单独的.ibd文件中,提高了空间管理效率。 4. **插入缓冲...
2. 当 `innodb_page_size` 设为 8KB 时,CPU 利用率上升到 30% 至 40%。虽然 CPU 负担增加,但在读取吞吐量方面,8KB 数据页表现优于 16KB。 只读性能测试中,对于读取非常频繁的场景,16KB 数据页和 8KB 数据页的...
适当调整可平衡等待和CPU利用率。 11. **innodb_lock_wait_timeout**:设定锁等待超时时间,避免死锁和长时间阻塞。应根据业务需求设定,避免过早中断长时间运行的任务。 在进行SQL性能分析时,`EXPLAIN`语句是...
同时,避免频繁的行数据更新,尤其是涉及变长字段的更新,可以减少页分裂和碎片,保持较高的空间利用率。 此外,合理设置页大小和行格式可以根据数据特性和业务需求来平衡存储效率和查询性能。例如,如果数据行较...
而且,不同的行格式对于性能有一定的影响,比如在磁盘空间利用和缓存命中率方面可能会有所不同。因此,在实际应用中,选择合适的行格式可以有效地提升数据库操作的效率。 综上所述,InnoDB记录结构的设计初衷是为了...
3. 磁盘空间规划:合理分配和调整表空间大小,有助于优化磁盘资源的利用率。 三、如何修改表空间大小 在Oracle数据库中,修改表空间大小通常涉及以下操作: 1. 扩大表空间:可以添加新的数据文件(Datafile)到表...
为了解决这个问题,一种常见的优化策略是选择适当大小的整型类型,比如INT或SMALLINT,以确保主键占用的空间尽可能小,从而提高B+Tree的页容量和空间利用率。另外,可以考虑使用更紧凑的数据结构,比如UUID,尽管...
- **MyISAM**:适用于读密集型应用,不支持事务,但有较高的读取速度和空间利用率。 - **NDB(NDB Cluster)**:设计用于分布式环境,提供高可用性和容错性。 - **MEMORY**:数据存储在内存中,适用于临时表或对速度...
大页的使用可以减少页间的切换,提高内存利用率,但也可能导致内存碎片和更复杂的管理。 总之,"py_innodb_page_type"提供的功能可以帮助我们深入理解InnoDB存储引擎的内部运作,特别是关于大页的使用,这对于...
当新记录插入时,InnoDB会保留1/16的页面空间作为预留空间,以适应未来的插入和更新操作。如果索引记录按顺序插入,页可填满至15/16;若插入顺序随机,填充率通常介于1/2至15/16之间。如果填充因子低于1/2,InnoDB...
如果一个页内大部分记录都被删除,InnoDB可能会进行页合并,将邻近利用率低的页合并成一个大页,标记为空闲,以便后续插入。但是,即使经过这样的优化,磁盘上的文件大小也不会减少,因为InnoDB并不直接收缩数据文件...
然而,`O_DIRECT`可能会导致更高的CPU利用率,因为它需要更复杂的I/O管理,并且可能不适用于所有类型的存储设备。 根据MySQL官方文档的建议,每个设置对性能的影响取决于硬件配置和工作负载。你应该根据自己的实际...
选择存储引擎时,应根据具体应用的需求,如是否需要事务处理、并发性能、数据完整性和空间利用率等因素来决定。在实际开发中,理解这些区别有助于做出更合适的选择,从而优化数据库性能和整体系统效率。
请注意,修改InnoDB的数据页大小并非一个轻率的决定,因为它可能影响到索引的效率、缓存的利用率,甚至可能导致数据迁移的问题。在进行这种优化之前,一定要先进行详尽的性能评估和风险分析。此外,由于这不是官方...