mysql innodb学习(四)

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

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

innodb_data_home_dir = /var/lib/mysql <BR>innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend缓存

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

<BR>innodb_data_file_path = /disk1/ibdata1:1G;/disk2/ibdata2:1G:autoextend数据结构

<BR>数据文件分布在不一样的磁盘分区,咱们可能会认为这能起到分散负载的做用,可是遗憾的是这并无起到应有的效果,由于innodb操做数据文件的方式为首尾相连的,即会把第一个文件先写满,而后再写第二个文件,所以负载并无分散到不一样的磁盘(有一个好的方式就是能够采用RAID的方式来实现分散负载)。工具

咱们能够看到第一个数据文件的大小是固定的,第二个文件的大小自动扩展的,那这样就可能会出现第二个文件会增加成一个很大的文件,可能会很差管理,所以咱们可能须要给数据文件设置一个最大值性能

<BR>innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend:max:5Gspa

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

innodb不容许咱们直接修改文件的大小,咱们只能是先把数据dump出来(经过mysqldumo工具),而后修改mysql的配置文件,从新设置数据文件的大小,而后再把数据从新导回去。innodb还有一个限制就是咱们不能直接像myisam那样直接把数据文件简单的拷贝到其余的机器上来实现数据拷贝的目的,由于mysql启动时会检测到若是实际的数据文件大小跟配置文件中设置的大小不一致的话,那就会致使mysql没法启动。索引

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

单个文件的优势: <BR>1.当咱们删除一个表的时候,就删除了对应表的ibd文件,那咱们就能回收删除后留下的空间了 <BR>2.就是咱们能把不一样的表文件放到不一样磁盘分区上,这样便可实现分散负载的效果了 <BR>3.咱们能直接把数据文件移动到另一台设置了这个选项的服务器上,达到拷贝的目的 <BR>4.咱们还能经过查看文件的大小了解表的大小,相比于使用共享表空间的只能使用show table status查看,这个操做将须要更多的工做来计算给这个表分配了多少页的数据

缺点: <BR>1.这个设置将会使用更多的磁盘空间,由于每一个表都会产生碎片,innodb处理碎片也是在每一个表的ibd文件中,当咱们有不少小的表的时候,这个状况会更明显,由于innodb表空间的页大小为16K,即便咱们的表大小只有1K,那也要至少占用16K的空间,这就会浪费不少的磁盘空间 <BR>2.删除表的性能问题,删除表的时候要在文件系统级别删除ibd文件,这个操做在有点文件系统上会很慢(好比ext3),对于这个问题,有一个折中的方法就是在文件系统级别将文件的大小设置为0,而后再手动删除文件

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

相关文章
相关标签/搜索