MySQL(一)之存储引擎类型
InnoDB:
- 经常更新的表,适合处理多重并发的更新请求。
- 支持事务。
- 可以从灾难中恢复(通过bin-log日志等)。
- 外键约束,支持外键。
- 支持自动增加列属性auto_increment。
- 索引结构为B+Tree
- 锁支持 行级,页级,表级
- 每个表有两个文件 .frm(表结构),ibd(数据索引文件)
InnoDB索引实现(聚集)
表数据文件本身就是 按B+Tree组织的一个索引结构文件
聚集索引——叶子节点包含了完整的数据记录
为什么InnoDB表必须有主键,并且推荐使用整形的自增主键?
为什么非主键索引结构叶子节点存储的是主键值(一致性和节省存储空间)
指针是双向的, 所以也适用于 where id<18,或者 where id>18
MyISAM:
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
- 不支持事务的设计,但是并不代表着有事务操作的项目不能用MyIsam存储引擎,可以在service层进行根据自己的业务需求进行相应的控制。
- 不支持外键的表设计。
- 查询速度很快 ,数据修改相对较少(阻塞问题),以读为主
- 对表进行加锁的场景。
- MyISAM极度强调快速读取操作。
- MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。
- 索引文件和数据文件是分离的, 每一个表三个文件.frm(表数据结构), .MYD(数据文件), .MYI(索引文件)
Memory存储引擎
Memory存储引擎采用逻辑介质是内存,因此其访问速度会非常快,其默认使用的是hash索引,一旦服务关掉,数据就会丢失。Memory存储引擎要求存储的数据是长度不变的格式,比如blob和text类型都不可以
适合的场景:
1、适合保存目标数据比较小,并且频繁进行访问的,如果太大的话,容易造成内存溢出,通过max_heap_table_size来设定表的大小;
2、存储在Memory引擎的表中的数据,如果丢失也没有关系的
3、如果数据是临时的,必须立刻用的到,那么可以存在内存当中。 Memory存储引擎支持hash索引和B树索引,hash索引用来比较相等会比较快,范围查找会比较慢,B树索引可以部分查询和通配查询,也可以使用<,>,= 等方便数据挖掘。 Memory存储引擎创建的表,最好是使用完之后,就删除。
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。