MySQL存储引擎:

存储引擎就是指表的类型以及表在计算机上的存储方式
数据库索引是在存储引擎层实现

InnoDB和MyISAM

图片.png

innoDB

innoDB 存储引擎支持事务,其设计目标是面向在线事务处理的应用 支持行级锁 支持外键。事务。 通过一些机制和工具支持真正的热备份(Xtrabackup) 支持崩溃后的安全恢复 数据和索引存储在共享表空间,可以通过配置分开 从 MySLQ 5.5.7 版本开始,InnoDB 存储引擎作为默认的存储引擎存在于 MySLQ 中。

InnoDB表组成部分:

每个数据表都有2个文件组成
.frm 后缀的文件存储的是表结构。
.ibd 后缀的文件存放索引文件和数据,独享表空间 (当你启用了 innodb_file_per_table,表被存储在他们自己的表空间里,但是共享表空间仍然在存储其它的 InnoDB 内部数据)
共享表空间文件(data目录下的ibdata1):将所有的表的数据和索引保存在ibdata1中,
优点:表空间文件大小不受表大小的限制
缺点:拷贝一个表的时候也必须拷贝整个表空间大文件,而且删除表后容易产生碎片。

独占表空间文件(ibd):若将innodb_file_per_table设置为on,则系统将为每一个表单独的生成一个table_name.ibd的文件,只是存放了数据、索引和插入缓冲,而撤销(undo)信息,系统事务信息,二次写缓冲等还是存放在了原来的共享表空间内。
优点:
可以实现单表在不同的数据库中移动。
空间可以回收,不管怎么删除,表空间的碎片不会太严重的影响性能
单表数据不是特别多的情况下,独立表空间明显比共享方式效率更高

缺点:单表体积可能过大,如超过100个G。

表结构文件(.frm):用来保存每个数据表的元数据(meta)信息,包括表结构的定义等
日志文件(redo文件等):ib_logfile1、ib_logfile2

ib_logfile0 、ib_logfile1是什么?

mysql的innodb中事务日志,或称redo日志,是二进制日志,在mysql中默认以ib_logfile0,ib_logfile1名称存在

可以手工修改参数,调节开启几组日志,默认是0和1两组。由参数innodb_log_files_in_group控制,若设置为4,则命名为ib_logfile0~3。

mysql采用顺序,循环写方式,每开启一个事务时,会把一些相关信息记录到事务日志中

作用:在系统崩溃重启时,可以做事务重做;在系统正常时,每次checkpoint时间点,会将之前写入事务应用到数据文件中。

ibdata1是什么?

是innodb引擎的共享表空间,用于存放
l 数据字典,也就是 InnoDB 表的元数据
l 变更缓冲区
l 双写缓冲区
l 撤销日志

详细解释
1. 数据字典Data dictionary: 只读的表,存储对象的相关信息,如占用空间,列的缺省值,约束信息,用户名,权限,审计信息等;
2. 双写缓冲区 Double write buffer:; Innodb写入数据默认是16k/pages为一个单位写入,而磁盘是4k/page一个单位,为了防止写入一半,断电无法恢复数据的情况发生,引入了double writer buffer机制;double write buffer是一段连续空间,大小2M(128 page),数据写入的时候先写到doublewrite空间,然后再写入到磁盘,如果发生写入了一个page一半的时候断电,恢复后会自动从doublewrite中恢复;
3. 插入缓冲区INSERT BUFFER:针对辅助索引(非unique),插入数据的时候,先将插入的数据在buffer中根据辅助索引叶子节点的Page_no排序,而后按照Page_no分批次插入,提高性能;
4. 回滚日志rollback segment: 用于存储未提交事物,便于用户rollback,当commit后,数据即被标记无效;
5. undo空间 用于存放undo 日志的;用于记录事物变更前的状态,如果未commit,其他session可以查看到变更前状态
6. 如果innodb_file_per_table=0,则Innodb的数据和索引也存储在ibdata中; (如果为1,则存储在表名相同的ibd和frm文件中); 如果表数据存储在ibdata中的话,那么删除表是不会释放空间;

ibdata1暴涨的原因

大量事务,产生大量的撤销日志
有旧事物长时间未提交,产生大量旧撤销日志
file I/O性能差,purge进展慢
32bit系统下bug

解决办法
升级到5.6以上(64-bit),采用独立undo表空间
当 ibdata1 文件增长太快,通常是 MySQL 里长时间运行的被遗忘的事务引起的。尝试去解决问题越快越好(提交或者杀死事务)

MyISAM

MyISAM 存储引擎不支持事务, 表锁, 空间和内存使用比较低。 拥有全文索引 压缩 和空间函数 不支持事务和行级锁,不支持崩溃后的安全恢复 表存储在两文件。myd(数据)和myi(索引),frm文件是结构 设计简单。某些场景下性能很好.select * 性能好。

Myisam: 表,数据和索引全部单独分开存储
每个数据表都有三个文件组成
.frm 后缀的文件存储的是表结构。
.myd 后缀的文件存储的是表数据。
.myi 后缀的文件存储的就是索引文件。

直接复制三个文件,然后直接放到其它的数据库下即可以使用.

memory引擎

MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。

该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。

MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。

注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。

其他表引擎:

csv archive blackhole