欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL 删除大表的性能问题解决方案

程序员文章站 2024-02-18 16:07:16
微博上讨论mysql在删除大表engine=innodb(30g+)时,如何减少mysql hang的时间,现做一下简单总结: 当buffer_pool很大的时候(30g+...
微博上讨论mysql在删除大表engine=innodb(30g+)时,如何减少mysql hang的时间,现做一下简单总结:

当buffer_pool很大的时候(30g+),由于删除表时,会遍历整个buffer pool来清理数据,会导致mysql hang住,解决的办法是:
1、当innodb_file_per_table=0的时候,以上不是问题,因为采用共享表空间的时候,该表所占用的空间不会被删除,buffer pool中的相关页不会 被discard。
2、当innodb_file_per_table=1的时候,并且当buffer_pool比较大的时候,遍历整个buffer pool 需要很多的时间(table_cache 会被锁住,所有的dml操作被阻止)。

认识误区
将innodb 表改为 myisam表,这个是没有效果的,该操作会删除旧表,建立新表,依然会遍历整个buffer_pool。

解决思路
1、采用脚本形式,批量删除部分记录
2、可以再slave上进行操作,进行主备切换(成本高)
3、percona 5.1.58以上版本都支持innodb_lazy_drop_table(bug不少,慎用)
4、与buffer pool无关,但是可以加快 删除数据文件的速度,同样能减少mysql hang住的时间。即:对数据文件建立硬链接,(依赖原理:os hard link 当多个文件名同时指向同一个inode时,这个inode的引用数n>1, 删除其中任何一个文件名只是删除了一个指针而已,不会删除数据文件。当inode的引用数n=1时, 删除文件需要去把这个文件相关的所有数据块清除,所以会比较耗时)