Myisam 更适合读取大于写入的业务,同时不支持事物。支持全文搜索。
Innodb 支持事物,效率上比myisam稍慢。不支持全文搜索。
Myism物理文件结构为:
.frm文件: 与表相关的 元数据信息 都存放在frm文件, 包括表结构的定义信息等 。
.myd文件: myisam存储引擎专用,用于存储myisam 表的数据
.myi文件: myisam存储引擎专用,用于存储myisam表的 索引相关信息
Innodb的物理文件结构为:
.frm文件: 与表相关的 元数据信息 都存放在frm文件, 包括表结构的定义信息等 。
.ibd文件和.ibdata文件:
这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为innodb的数据存储方式能够通过配置来决定是使用 共享表空间 存放存储数据,还是用 独享表空间 存放存储数据。
独享表空间 存储方式使用.ibd文件,并且每个表一个ibd文件
共享表空间 存储方式使用.ibdata文件,所有表共同使用一个ibdata文件
觉得使用哪种方式的参数在mysql的配置文件中 innodb_file_per_table
关于删除了数据之后,物理文件大小并没有变化的解释
删除之后还有碎片,通过OPTIMIZE TABLE 命令来进行表优化。这个命令可以将表中的空间碎片进行合并,并且可以消除由于删除或者更新造成的空间浪费 。OPTIMIZE TABLE 命令只对 MyISAM 、 BDB 和 InnoDB 表起作用 。
在InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存储方式的表叫索引组织表。在InnoDB存在引擎表中,每张表都有个主键(Primary key),如果在创建表时没有显示定义主键,则会按照如下方式选择或者创建主键:
(1) 判定是否有非空的唯一索引(unique not null),如果有则该列即为主键。若果有多个,则选择建表是第一个定义的非空位于索引为主键。注意:主键的选择根据的是定义索引的顺序,而不是建表时的列的顺序。
(2) 如果不存在唯一索引,InnoDB存储引擎字段创建一个6字节大小的指针(仅内部可见)。
在InnoDB存储引擎中,所有的数据都被逻辑地存放在一个空间中,称之为表空间(tablespace)。表空间又由段(segment)、区(extent)、页(page)组成。InnoDB存储引擎的逻辑存储结构如下图。
表空间 可以看见InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。表空间又分为独立表空间和共享表空间。通过参数innodb_file_per_table参数来决定使用何种类型的表空间。但是需要注意的是独立表空间内只存放 数据、索引和插入缓冲页 ,其他的数据,如回滚(undo)信息、插入缓冲索引页、系统事务信息、二次写缓冲(double write buffer)等还是放置在原来的共享表空间中。
段 表空间由各个段组成。常见的段有数据段、索引段、回滚段等。InnoDB存储引擎是索引组织表,因此数据即索引,索引即数据。数据段即为B+树的叶子点(leaf node segment),索引段为B+数据的非索引节点(non-leaf node segment)。回滚段比较特殊以后在介绍。段都是引擎自身管理的。
区 区是由连续页组成的空间。InnoDB存储引擎页的大小为16KB,一个区有64个连续的页组成,所以每个区的大小都是 1MB 。参数 innodb_page_size 可设置页的大小4K、8K,但是,不论页的大小怎么变化,区的大小不变1M。但是有这样一个问题:在开启独立表空间之后,创建的表默认大小是 96K ,区中是64个连续的页,创建的表空间应该是1M才对呀?这是因为在每个段的开始时,先用 32个页 大小的碎片页(fragment page)来保存数据,在使用完这些页之后才是64个连续的页的申请。这样做是对于一些小表或者undo这类的段,可以在开始时申请较少的空间,节省磁盘容量的开销。
页 页是InnoDB磁盘管理的最小单位。默认大小为16K,可以通过innodb_page_size将页的大小设置为4K、8K、16K,则所有表中页的大小都为设置值,不可以对其再次修改。除非通过mysqldump导入和导出 *** 作来产生新的库。常见的页的类型有:数据页(B-tree Node)、undo页(unod Log Page)、系统页(System Page)、事务数据页(Transaction system Page)、插入缓冲空闲列表页(Insert Buffer Free List)、未压缩的二进制大对象页(Uncompressed BLOB Page)、压缩的二进制对象页(compressed BLOB Page)。
行 InnoDB存储引擎是面向行的(row-oriented),也就是说数据是按行进行存放的。每个页存放的行记录也是有硬性定义的,最多运行存放(16K/2-200)行的记录,即7992行记录。
InnoDB表由共享表空间(ibdata1),redo日志文件组(ib_logfile0,ib_logfile1),表结构定义文件(表名.frm)组成。当开启独立表空间时,还有以 表名.ibd 的文件,存储数据,索引,插入缓存列。
InnoDB存储引擎的记录是以行的形式存储的,这就表明页中保存着表中一行行的数据。其类型有REDUNDANT、 COMPACT、COMPRESS、DYNAMIC四种。可以通过 show table status 。
COMPACT 在MySQL 5.0中引入,其设计目标是高效的存储数据。也就是一个页中存放的行数据越多,其性能越高。compact行记录的存放方式:
REDUNDANT
行溢出数据
Compressed和Dynamic行记录格式
CHAR的行存储结构
File Header:文件头
Page Header:页头
Infimum和Supremum Record
User Record和Free Space
Page Directory:页目录
File Trailer:文件结尾信息
MySQL-InnoDB表 -
MySQL InnoDB存储引擎之表(一)_chenlvzhou的专栏-CSDN博客
因为被破坏的地方只在索引的部分,所以当使用innodb_force_recovery = 1运行InnoDB时, *** 作如下:执行check,repair table 都无效
alter table email_status engine =myisam#也报错了,因为模式是innodb_force_recovery =1。
ERROR 1025 (HY000): Error on rename of '...' to '....' (errno: -1)
建立一张表:create table email_status_bak #和原表结构一样,只是把INNODB改成了MYISAM。把数据导进去insert into email_status_bak select * from email_status
删除掉原表:
drop table email_status
注释掉innodb_force_recovery 之后,重启。
重命名:
rename table edm_email_status_bak to email_status
最后该回存储引擎
alter table edm_email_status engine = innodb
总结:
这里的一个重要知识点就是 对 innodb_force_recovery 参数的理解了,要是遇到数据损坏甚至是其他的损坏。可能上面的方法不行了,需要尝试另一个方法:insert into tb select * from ta limit X;甚至是dump出去,再load回来。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)