存储引擎 Storage engine:MySQL 中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。
常用的存储引擎有以下:
• Innodb 引擎:Innodb 引擎提供了对数据库ACID 事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。一次写入操作是一次事务,innodb首先把事务数据写入到Buffer Pool和事务日志中,也就是在大脑中记忆下来,并写下草稿。然后就可以提交事务,响应客户端了。之后innodb在“有时间的时候”,异步地把这次写入的数据从Buffer Pool,或者事务日志中正式地写入到Datafile中,形成“正稿”。
其中,innodb为了保证事务日志这个“草稿”一定能无损地还原成正稿,还不能占用太多空间,事务日志需要有以下特点:
事务日志中一定保存了要写入的所有数据内容
事务日志只会把新事务追加在日志最后,而不会去修改之前的内容
一旦事务数据被写到datafile,事务日志中的“草稿”就可以删除了
通过上面3个特点我们可以看出,在形成“正稿”之前,“草稿”是不会被删除的;同时,“草稿”的空间是可以被循环利用的;最后,只要“草稿”在,我们一定能写出“正稿”。

• MyIASM 引擎(原本Mysql 的默认引擎):不提供事务的支持,也不支持行级锁和外键。MyISAM使用的是表级锁,也就意味着在对表中的数据进行修改时,需要对整个表进行加锁。而在对表中的数据进行读取时,也需要对所有的表加共享锁。读取和写入这两种操作是互斥的,当然在一些情况下我们对表的数据进行读取时,也可以在表的末尾插入数据。由此可以看出,MyISAM对读写混合的并发性并不是太好,如果只是只读的话,就并发性而言,还是可以接受的,因为共享锁不会阻塞共享锁。

MEMORY 引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高
MyISAM 与 InnoDB 区别
MyISAM | Innodb | |
|---|---|---|
存储结构 | 每张表被存放在三个文件: | 所有的表都保存在同一个数据文 |
frm-表格定义、 | 件中(也可能是多个文件,或者 | |
MYD(MYData)-数据文件、 | 是独立的表空间文件), | |
MYI(MYIndex)-索引文件 | InnoDB 表的大小只受限于操作 | |
系统文件的大小,一般为 2GB | ||
存储空间 | MyISAM 可被压缩,存储空间 | InnoDB 的表需要更多的内存和 |
较小 | 存储,它会在主内存中建立其专 | |
用的缓冲池用于高速缓冲数据和 | ||
索引 | ||
可移植性、备份及 | 由于 MyISAM 的数据是以文件 | 免费的方案可以是拷贝数据文 |
恢复 | 的形式存储,所以在跨平台的 | 件、备份 binlog,或者用 |
数据转移中会很方便。在备份 | mysqldump,在数据量达到几十 | |
和恢复时可单独针对某个表进 | G 的时候就相对痛苦了 | |
行操作 | ||
文件格式 | 数据和索引是分别存储的,数 | 数据和索引是集中存储的,.ibd |
据.MYD,索引.MYI | ||
记录存储顺序 | 按记录插入顺序保存 | 按主键大小有序插入 |
外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
锁支持(锁是避免 | 表级锁定 | 行级锁定、表级锁定,锁定力度 |
资源争用的一个机 | 小并发能力高 | |
制,MySQL 锁对用 | ||
户几乎是透明的) | ||
SELECT | MyISAM 更优 | |
INSERT、 | InnoDB 更优 | |
UPDATE、 | ||
DELETE | ||
select count(*) | myisam 更快,因为 myisam | |
内部维护了一个计数器,可以 | ||
直接调取。 | ||
索引的实现方式 | B+树索引,myisam 是堆表 | B+树索引,Innodb 是索引组织 |
表 | ||
哈希索引 | 不支持 | 支持 |
全文索引 | 支持 | 不支持 |