`
丁林.tb
  • 浏览: 794776 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于InnoDB表的page利用率和optimize table

阅读更多

上一篇我们介绍了ibd_used这个工具,我们用来量化看表数据文件的page使用率。这里用来说明optimize table这个命令的问题和优化。

 

实例准备

建一个这样的表

CREATE TABLE `tb` (

`seq_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

`a` varchar(32) DEFAULT NULL,

`b` varchar(32) DEFAULT NULL,

`c` varchar(32) DEFAULT NULL,

`d` char(255) DEFAULT NULL,

Primary key (seq_id),
KEY a (a),

KEY bc (b,c),

KEY cb (c,b)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

执行语句为“insert into tb(a,b,c) values(randstr, randstr, randstr); randstr是客户端程序生成的长度30字节的随机字符串。30个线程并发,每个线程插入1w条记录。

等待更新完成后(包括purge完成,从系统的vmstat上看无任何io),执行./ibd_used tb.ibd 0 100000000,可以从最后4行看到各个索引的page平均利用率如下图。

 

 

说明: 你会发现即使是主键索引,利用率也不一定很高。原因是什么?

Optimize table 效果

我们知道Optimize table是用来作表整理的, 执行一下 optimize table tb,再看ibd_used的结果。

说明:这里我们发现,pkpage利用率明显提升,是optimize效果,但是其他几个索引的page利用率却没有明显效果。为什么呢?

 

1)       首先是上面没有提的那个“异常”,既然是自增主键,为什么在optimize之前,pk的利用率不高?原因是多线程插入,虽然seq_id是递增申请,但不能保证是递增更新到page上。而通过optimize后,等于是单线程重新整理了。

 

2)       为什么其他索引的page利用率没有提升,这个就涉及到optimize table的内部执行过程。如下:

a)       建一个临时表,表结构与tb相同

b)       按照tb主键顺序将tb数据一行行的插入到临时表中

c)       删掉tb,临时表重命名为tb

所以我们看到对于其他索引,插入的值仍然是随机的过程。

 

改进的思路

我们知道InnoDB5.1的时候innodb_plugin里面就有fast index creatation了,上述过程如果改成如下:

a)       建一个临时表,表结构与tb相同

b)       删掉临时表的所有非聚簇索引

c)       按照tb主键顺序将tb数据一行行的插入到临时表中

d)       建立临时表的所有非聚簇索引

e)       删掉tb,临时表重命名为tb

这样在执行步骤d)时,每个非聚簇索引都是按照排序好方式构建,则能让所有的索引page都很“紧凑”。

 

Percona版本的 expand_fast_index_creation参数

Percona版本中新增了这个参数,默认值是OFF,需要配置文件设置ON或者通过set命令热修改。

当设置为ON时,则optimize table tb实现的就是上述我们说到的改进流程。从ibd_used看到执行结果看到的效果如下:

 

 

小结

所以当你需要通过optimze table优化表空间,

若是使用percona版本则最好先打开expand_fast_index_creation;

若是官方版本,则建议自己写脚本建临时表,按照上述的过程a~e来执行,达到最优的效果。

  • 大小: 27.7 KB
  • 大小: 26.2 KB
  • 大小: 28.9 KB
1
13
分享到:
评论
3 楼 lenaLee 2012-04-30  
丁林.tb 写道
lenaLee 写道
丁哥好,我是MySql的新兵。
关注你的文章,发现您一直使用的是InnoDB引擎。现在好像NDB比较火,便于横向扩展。请问你觉得哪个将来会发展得比较好?
我以前用的是SqlServer,SQL语句还比较熟,能给我些怎么学好MySql的建议吗,谢啦!

NDB目前官方在主推,我觉得以后会越来越完善。只是目前很多应用需要的功能都可以用InnoDB + 应用层的分库分表解决,可控性也更好,所以使用得比较多。

从SqlServer要切换到MySQL应该还ok的,你可以试着将SQLServer里面的建表过程、索引、存储过程这些在自己试验着转到MySQL里面,来熟悉两者的差别。

受益匪浅,非常感谢!
2 楼 丁林.tb 2012-04-29  
lenaLee 写道
丁哥好,我是MySql的新兵。
关注你的文章,发现您一直使用的是InnoDB引擎。现在好像NDB比较火,便于横向扩展。请问你觉得哪个将来会发展得比较好?
我以前用的是SqlServer,SQL语句还比较熟,能给我些怎么学好MySql的建议吗,谢啦!

NDB目前官方在主推,我觉得以后会越来越完善。只是目前很多应用需要的功能都可以用InnoDB + 应用层的分库分表解决,可控性也更好,所以使用得比较多。

从SqlServer要切换到MySQL应该还ok的,你可以试着将SQLServer里面的建表过程、索引、存储过程这些在自己试验着转到MySQL里面,来熟悉两者的差别。
1 楼 lenaLee 2012-04-29  
丁哥好,我是MySql的新兵。
关注你的文章,发现您一直使用的是InnoDB引擎。现在好像NDB比较火,便于横向扩展。请问你觉得哪个将来会发展得比较好?
我以前用的是SqlServer,SQL语句还比较熟,能给我些怎么学好MySql的建议吗,谢啦!

相关推荐

    查看InnoDB的磁盘空间利用率

    通过阅读源码,我们可以理解InnoDB如何管理空间,例如`fsp0fsp.h`和`fsp0fsp.c`文件包含了关于表空间和段(segments)的管理。然而,直接阅读源码通常需要深入的MySQL和C/C++知识,不适合初学者。 此外,MySQL还...

    mysql下优化表和修复表命令使用说明(REPAIR TABLE和OPTIMIZE TABLE)

    值得注意的是,`OPTIMIZE TABLE` 对于InnoDB存储引擎的表,实际上并不重新组织磁盘上的数据,而是创建一个新的表并复制数据,然后删除旧表并重命名新表。这可能导致一定的服务中断,因此需要谨慎使用。 除了上述...

    MySQL数据库INNODB 表损坏修复处理过程

    MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。

    py_innodb_page_info.zip

    9. **优化应用**:通过对页信息的分析,可以识别可能导致性能问题的因素,如页分裂、空间利用率低等,并据此调整表设计、索引策略或事务设置。 10. **学习与实践**:这本书籍结合`py_innodb_page_info`工具,为读者...

    py_innodb_page_info工具

    此外,`py_innodb_page_info`还能揭示InnoDB的锁机制,例如行级锁(row lock)、表级锁(table lock)等,这些都是保证并发性和事务安全的关键。通过对锁状态的分析,我们可以优化查询性能,减少锁定冲突。 总的来...

    InnoDB存储引擎中有页(Page)的概念

    InnoDB存储引擎中默认每个页的大小为16KB,可通过参数innodb_page_size将页的大小设置为4K、8K、16K,在MySQL中可通过如下命令查看页的大小: mysql> show variables like 'innodb_page_size'; 而系统一个磁盘块的...

    py_innodb_page_info.py

    `py_innodb_page_info.py`是一个用Python编写的实用工具,专门用于探索InnoDB存储引擎的表空间,揭示其中各个页面的类型和详细信息。本文将详细解析这个工具的功能、工作原理以及其在实际应用中的价值。 首先,我们...

    实战mysql innodb 删除数据后释放磁盘

    InnoDB 删除数据后释放磁盘空间需要通过设置参数 innodb_file_per_table=1 和使用 OPTIMIZE TABLE 命令来实现。如果没有设置这个参数,那么需要将数据库导出,删除 InnoDB 数据库文件,然后再倒入。 此外,InnoDB ...

    探讨Mysql中OPTIMIZE TABLE的作用详解

    - 对于InnoDB,`OPTIMIZE TABLE`会重建整个表,包括更新索引统计信息和释放簇索引中的未使用空间。 5. **锁表行为**: 在`OPTIMIZE TABLE`运行期间,表会被锁定,这意味着其他用户无法进行读写操作,直到优化完成...

    MySql innodb 引擎表存储分析

    - 当启用 `innodb_file_per_table` 参数后,每个表的数据和索引将存储在单独的 `.ibd` 文件中。而其他一些元数据,如撤销 (undo) 信息和系统事务信息,则仍然存储在共享表空间内。 - 数据段 (Data Segment) 和索引...

    py_innodb_page_info工具类 包含python2,python3两个版本

    py_innodb_page_info工具为《INNODB存储引擎》作者姜承尧写的。 该工具用来分析表空间中的各页得类型和信息,用python编写。 网上多是python2版本的,这里给出python3版本的。

    py_innodb_page.tar.gz

    总之,"py_innodb_page.tar.gz"提供了一个学习和探索InnoDB内部机制的实践平台。通过对页的逐层解析,我们不仅可以加深对MySQL InnoDB存储引擎的理解,还能提升在数据库优化、故障排查等方面的能力。在Python环境中...

    MySQL数据库INNODB表损坏修复处理过程分享

    innodb表损坏不能通过repair table 等修复myisam的命令操作。现在记录下解决过程,下次遇到就不会这么手忙脚乱了。 处理过程: 一遇到报警之后,直接打开错误日志,里面的信息:InnoDB: Database page corruption ...

    关于InnoDB的索引大小

    最后,`ibd`文件是InnoDB存储引擎的表空间文件,它包含了表的数据和索引。通过检查`ibd`文件的大小,可以间接评估索引的占用空间。如果需要进一步分析,可以使用`myisamchk`或`innodb_monitor`等工具,但这些工具...

    MySQL数据页功能性能测试innodb-page-size

    2. 当 `innodb_page_size` 设为 8KB 时,CPU 利用率上升到 30% 至 40%。虽然 CPU 负担增加,但在读取吞吐量方面,8KB 数据页表现优于 16KB。 只读性能测试中,对于读取非常频繁的场景,16KB 数据页和 8KB 数据页的...

    InnoDB 表的限制

    《InnoDB表的限制》 ...在实践中,我们需要根据具体的应用场景和数据规模,合理规划表结构和索引策略,以充分利用InnoDB的优势。同时,定期监控数据库状态,及时调整相关参数,可以确保系统的健康运行。

Global site tag (gtag.js) - Google Analytics