MYSQL的碎片问题主要有2类: 一个是文件系统的碎片,一个是innodb的内部碎片。
最近测试中发现,无论是单表空间,还是多表空间,在windwos xp下都有严重的磁盘碎片问题。
如果采用统一表空间,那么最好一次性把文件大小规划到位,然后启动mysql创建统一表空间,创建完成后,立即用windows自带的碎片整理工具整理,你会惊讶的发现刚创建的大表文件竟然有如此多的碎片,如果不进行这样的操作系统层面的碎片整理,即使mysql innodb程序自己认为是连续读写空间,但是实际读写是不连续的,还是大量的随机读写,IO性能很低. 我推荐一次性分配全部最大空间,再做一次碎片整理避免windows碎片问题,这个问题可以一劳永逸的得到解决, 然后只剩下innodb的内部碎片问题需要关注了。推荐定期进行alter table 方式重新生成数据,新数据按照连续表空间排列,解决了innodb的内部碎片问题。
设置innodb_file_per_table = 1使用单表空间以后,虽然表面上是容易处理碎片问题,因为进行单表空间更小整理更容易, 但是实际上,碎片问题有可能更严重,这里主要是windows的碎片问题和innodb的内部碎片问题混合在一起,导致很难消除的碎片,对于这种情况,我推荐先进行windows系统的碎片整理,由于独立表空间一直在跟随数据量的变化而变化,所以,windows碎片严重是长期存在的现实, 首先要日常化定期整理windows碎片, 再进行日常化定期innodb的碎片整理,这样就需要2个维护整理碎片的操作,否则,mysql的性能,将同时受2种碎片的影响,IO性能非常低 因此,从碎片维护的角度考虑问题,我不推荐使用单表空间。