mysql innodb学习(四)

前面介绍了一下innodb的内存缓存区和日志文件,这篇主要记录一下innodb的表空间(tablespace),顾名思义,表空间就是存储表的,innodb的表空间不仅仅存储了数据和索引,还存储了重做日志,插入缓存,doublewrite缓存以及其他的一些内部数据结构。

innodb主要使用下面两个参数来配置表空间:

innodb_data_home_dir = /var/lib/mysql
innodb_data_file_path =
ibdata1:1G;ibdata2:1G:autoextend

这两个选项配置了innodb的数据目录在/var/lib/mysql下,有2个数据文件ibdata1和ibdata2,大小都是以1G,但是ibdata2可以自动扩展。我们还可以把不同的文件放到不同的磁盘分区,例如


innodb_data_file_path =
/disk1/ibdata1:1G;/disk2/ibdata2:1G:autoextend


数据文件分布在不同的磁盘分区,我们可能会认为这能起到分散负载的作用,但是遗憾的是这并没有起到应有的效果,因为innodb操作数据文件的方式为首尾相连的,即会把第一个文件先写满,然后再写第二个文件,因此负载并没有分散到不同的磁盘(有一个好的方式就是可以采用RAID的方式来实现分散负载)。

我们可以看到第一个数据文件的大小是固定的,第二个文件的大小自动扩展的,那这样就可能会出现第二个文件会增长成一个很大的文件,可能会不好管理,因此我们可能需要给数据文件设置一个最大值


innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend:max:5G

这样就设置了ibdata2的最大限制为5G,这里有个问题就是,当我们删除一些表和数据后,我们怎么回收删除后留下的空间呢,ibdata2文件的大小为5G,但是可能其中有很多空闲的空间,那我们怎么回收呢?

innodb不允许我们直接修改文件的大小,我们只能是先把数据dump出来(通过mysqldumo工具),然后修改mysql的配置文件,重新设置数据文件的大小,然后再把数据重新导回去。innodb还有一个限制就是我们不能直接像myisam那样直接把数据文件简单的拷贝到其他的机器上来实现数据拷贝的目的,因为mysql启动时会检测到如果实际的数据文件大小跟配置文件中设置的大小不一致的话,那就会导致mysql无法启动。

innodb还提供一个参数innodb_file_per_table,这个选项使得innodb能为每个表存储为一个单独的文件tablename.ibd,但是要注意的是,ibd文件仅仅存储了表的数据、索引插入缓冲等,其余的数据还是存储在共享表空间中。

单个文件的优点:

1.当我们删除一个表的时候,就删除了对应表的ibd文件,那我们就能回收删除后留下的空间了

2.就是我们能把不同的表文件放到不同磁盘分区上,这样即可实现分散负载的效果了

3.我们能直接把数据文件移动到另外一台设置了这个选项的服务器上,达到拷贝的目的

4.我们还能通过查看文件的大小了解表的大小,相比于使用共享表空间的只能使用show table status查看,这个操作将需要更多的工作来计算给这个表分配了多少页的数据

缺点:

1.这个设置将会使用更多的磁盘空间,因为每个表都会产生碎片,innodb处理碎片也是在每个表的ibd文件中,当我们有很多小的表的时候,这个情况会更明显,因为innodb表空间的页大小为16K,即使我们的表大小只有1K,那也要至少占用16K的空间,这就会浪费很多的磁盘空间

2.删除表的性能问题,删除表的时候要在文件系统级别删除ibd文件,这个操作在有点文件系统上会很慢(比如ext3),对于这个问题,有一个折中的方法就是在文件系统级别将文件的大小设置为0,然后再手动删除文件

那有没有好的推荐配置呢?一个建议就是设置innodb_file_per_table,然后设置一个固定值的innodb_data_file_path,实际情况可以根据具体的负载来设置。

你可能感兴趣的:(mysql,InnoDB)