mysql InnoDB引擎 共享表空间和独立表空间

PS:innodb这种引擎,与MYISAM引擎的区别很大.特别是它的数据存储格式等.对于innodb的数据结构,首先要解决两个概念性的问题: 共享表空间以及独占表空间.

  1. 什么是共享表空间和独占表空间

    共享表空间以及独占表空间都是针对innodb表的数据存储而言的,ibdata1为innodb引擎的存储数据与索引的数据文件,ib_logfile0与ib_logfile1为innodb引擎使用的日志文件
    共享表空间: mysql服务器中所有数据库的innodb表(数据,索引)全部放在一个文件中,默认这个共享表空间的文件路径在data目录下. 默认的文件名为:ibdata1 初始化为10M.
    独占表空间: 每一个表都将会生成以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件. 其中这个文件包括了单独一个表的数据内容以及索引内容,默认情况下它的存储位置也是在表的位置之中.

  2. 两者之间的优缺点

    1. 共享表空间:

      优点:
      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个库而且存在删除库的的情况就郁闷了!

    2. 独立表空间:

      在配置文件(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有可能响应也 是较慢了,对于独立表空间还容易发现问题早做处理.

    相比较之下,使用独占表空间的效率以及性能会更高一点,推荐使用独立表空间的原因:.

    1. 从性能上对比共享表空间和独立表空间:

      共享表空间在Insert操作上少有优势.其它都没独立表空间表现好.这里也有一个TIPS当启用独立表空间时,请合理调整一下:innodb_open_files .

    2. 从Linux系统处理上出发:

      文件系统fsync一大片更新数据,对系统io冲击较大.若分隔成多个小数据fsync,能够减少对读的影响. 同时从mysql代码,发现mysql保证两次fsync之间至少有20ms的sleep,这样的话,若将一次fsync变成多次小数据操作,应该能够减 少慢查询的比例.所以对于大量更新操作的系统不太适合用共享表空间

  3. 共享表空间以及独占表空间之间的转化

    1. innodb_file_per_table

                          mysql> show variables like '%per_table%';
                          +-----------------------+-------+
                          | Variable_name         | Value |
                          +-----------------------+-------+
                          | innodb_file_per_table | OFF   |
                          +-----------------------+-------+
                          1 row in set

      innodb_file_per_table 通过这个参数来实现的转化,如果为ON说明所使用的是独占表空间【默认情况下,所使用的表空间为共享表空间】
      innodb_file_per_table值来进行修改即可,但是对于之前使用过的共享表空间则不会影响,除非手动的去进行修改或者是
      innodb_file_per_table=1 为使用独占表空间
      innodb_file_per_table=0 为使用共享表空间



200-120
210-260
200-310
SY0-401
810-403
300-320
400-101
70-533
N10-006
MB2-707
210-060
400-201
350-018
ADM-201
CISSP
1Z0-060
400-051
300-075
MB2-704
100-101
9L0-012
642-999
300-115
MB5-705
70-461
1V0-601
300-206
352-001
70-486
300-135
NS0-157
PR000041
300-101
70-346
CCA-500
70-480
300-208
70-462
EX200
1Z0-803
EX300
ICBB
1Z0-808
AWS-SYSOPS
1Z0-434
300-070
CAS-002
220-801
SSCP
PMP
642-997
70-410
101-400
ITILFND
AX0-100
2V0-621
102-400
101
1Z0-067
220-802
70-463
C_TAW12_731
70-494
CISM
700-501
NSE4
NSE7
70-483
70-488
相关文章
  1. 理解MySQL——索引与优化(转载)
  2. MySQL数据库命名规范及约定
  3. MySQL索引背后的数据结构及算法原理
  4. MySQL数据备份和binlog数据恢复案例分析
  5. mysql binlog详解
  6. MySQL Replication(Master与Slave基本原理及配置)
本站版权
1、本站所有主题由该文章作者发表,该文章作者与尘埃享有文章相关版权
2、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和尘埃的同意
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
4、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
5、原文链接:
二维码
Posted in mysql
Comments are closed.