PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间.mysql
共享表空间以及独占表空间都是针对innodb表的数据存储而言的,ibdata1为innodb引擎的存储数据与索引的数据文件,ib_logfile0与ib_logfile1为innodb引擎使用的日志文件
共享表空间: mysql服务器中全部数据库的innodb表(数据,索引)所有放在一个文件中,默认这个共享表空间的文件路径在data目录下. 默认的文件名为:ibdata1 初始化为10M.
独占表空间: 每个表都将会生成以独立的文件方式来进行存储,每个表都有一个.frm表描述文件,还有一个.ibd文件. 其中这个文件包括了单独一个表的数据内容以及索引内容,默认状况下它的存储位置也是在表的位置之中.sql
优势:
InnoDB在共享表空间模式下,是支持多文件的,用innodb_data_file_path选项能够配置:
innodb_data_file_path = /disk1/ibdata1:2G;/disk2/ibdata2:2G:autoextend
这样配置就把数据文件分散在了disk1和disk2两个路径下,第一个文件固定2G大小,第二个文件初始化2G,能够自增加.(数据文件大小不受表大小的限制,如一个表能够分布在不一样的数据文件上).数据和文件放在一块儿方便管理.
缺点:
1.全部的数据和索引存放到一个文件中意味着将有一个很常大的文件,虽然能够把一个大文件分红多个小文件,可是服务器上的全部库中的innodb表及索引在表空间中混合存储,这样对于一个表作了大量删除操做后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间.
2.共享表空间不会收缩! ibdata1 只会一个劲的增加.对于一台服务器上面n个库并且存在删除库的的状况就郁闷了!数据库
在配置文件(my.cnf)中设置: innodb_file_per_table服务器
优势:
1. 每一个表都有自已独立的表空间.
2. 每一个表的数据和索引都会存在自已的表空间中.
3. 能够实现单表在不一样的数据库中移动.
4. 空间能够回收(除drop table操做处,表空不能自已回收)
a) Drop table操做自动回收表空间,若是对于统计分析或是日值表,删除大量数据后能够经过:alter table TableName engine=innodb;回缩不用的空间.
b) 对于使innodb-plugin的Innodb使用turncate table也会使空间收缩.
c) 对于使用独立表空间的表,无论怎么删除,表空间的碎片不会太严重的影响性能,并且还有机会处理.
缺点:
单表增长过大,如超过100个G.
对于单表增加过大的问题,若是使用共享表空间能够把文件分开,但有一样有一个问题,若是访问的范围过大一样会访问多个文件,同样会比较慢.对于独立 表空间也有一个解决办法是:使用分区表,也能够把那个大的表空间移动到别的空间上而后作一个链接.其实从性能上出发,当一个表超过100个G有可能响应也 是较慢了,对于独立表空间还容易发现问题早作处理.数据结构
相比较之下,使用独占表空间的效率以及性能会更高一点,推荐使用独立表空间的缘由:app
共享表空间在Insert操做上少有优点.其它都没独立表空间表现好.这里也有一个TIPS当启用独立表空间时,请合理调整一下:innodb_open_files .性能
文件系统fsync一大片更新数据,对系统io冲击较大.若分隔成多个小数据fsync,可以减小对读的影响. 同时从mysql代码,发现mysql保证两次fsync之间至少有20ms的sleep,这样的话,若将一次fsync变成屡次小数据操做,应该可以减 少慢查询的比例.因此对于大量更新操做的系统不太适合用共享表空间spa
转自(http://wangying.sinaapp.com/archives/1488)日志