MySQL删除大表的性能问题解决方案
当buffer_pool非常大(30g +),它会导致MySQL挂的住所,因为删除表,它会遍历整个缓冲池清理数据。
1、当innodb_file_per_table = 0,以上是没有问题的,因为当使用共享表空间,由表占用的空间不会被删除,并在缓冲池的相关页面将不会被抛弃。
2、当innodb_file_per_table = 1,当buffer_pool较大,需要花费大量的时间来遍历缓冲池。(table_cache将锁定的所有DML操作的阻塞)。
误解:
改变InnoDB表的MyISAM表是不是有效,删除旧表,建立一个新表,还有遍历整个buffer_pool。
解决这个想法:
1。使用脚本形式,批量删除部分记录
2。该操作可以在从属端完成,并且执行主切换(高代价)。
3,比Percona 5.1.58支持innodb_lazy_drop_table(很多BUG,小心)
4,与缓冲池无关,但可以加快数据文件的删除速度,减少MySQL挂起的时间,也就是说,设置硬链接到数据文件。依赖原则:操作系统硬链接。当多个文件名指向同一个节点在同一时间,inode参考号码是:1。删除其中的任何一个只是一个指针删除,并不会删除数据文件。当inode编号为N = 1,删除文件需要清除所有数据块相关的档案,那么它将花费更多的时间。