存储引擎
数据库引擎是数据库用于存储、处理和保护数据的核心服务,不同的数据库引擎有其各自的特点,如存储机制、索引技巧、主键的处理、锁的粒度等特点便随着引擎的不同而变化。不同的数据文件在磁盘的组织形式。
常用存储引擎
InnoDB
InnoDB 支持ACID,行锁和外键,并且是Mysql的默认存储引擎。
InnoDB 主要通过锁和MVCC来支持高并发。其默认级别是REPEATABLE READ(可重复读),并且通过间隙锁(next-key locking)策略防止幻读的出现。
InnoDB 表是基于聚簇索引建立的,不过它的二级索引(secondary index,非主键索引)中必须包含主键列,所以如果主键很大的话,其他的所有索引都会很大。因此,若表上的索引较多的话,主键应当尽可能的小。
逻辑存储结构
InnoDB存储引擎中,表都是根据主键顺序组织存放的,这种存放方式的表称为索引组织表。如果没有主键则通过以下方式:
- 判断表中是否有非空的唯一键,有,则以该列为主键。若有多个非空唯一键,则以第一个定义的为主键
- InnoDB引擎自动创建一个6字节大小的rowid作为主键。rowid的分配是全局的,所有的表都共享这个ID,并不是每个行记录都有rowid。
InnoDB 采用B+树存储数据,为什么选择B+树作为数据库的存储结构?
- AVL树、红黑树:每个节点上仅仅存储了单一节点,会导致整个树的深度较大,IO也因此增多
- Hash:
- 难以设计散列度高的哈希函数
- 虽然等值查询较快,但对于范围查询则难以查询
- B树:虽然每个节点能够存储多个值,但由于节点中直接存储了记录,因此单个节点所能够记录的数据有限。
- B+树,叶子节点存储真实数据,而非叶子节点仅仅存储索引值,因此每个节点通常能够记录更多的索引,降低了树的高度。
聚簇索引的优缺点:
- 数据访问更快,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快。
- 聚簇索引对于主键的排序查找和范围查找速度非常快。
- 插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键。
- 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
- 二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据
InnoDB的逻辑存储结构包含:
- 表空间
- 段
- 区
- 页: 页是InnoDB磁盘管理的最小单位,默认每个页的大小为16KB
- 行
MyIsam
MyIsam 使用非聚簇索引
- 不支持事务
- 不支持外键
- 表级锁定,读写互相阻塞:读阻塞写,不会阻塞读。而写锁则会把读写都阻塞。
- 只缓存索引,不缓存数据:缓存在内存的是索引,不是数据。MyIsam的索引是压缩的,可以更好的利用内存,而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大。
- 读取速度较快
Memory
Memory 采用的逻辑存储介质是系统内存,支持哈希和B树索引。虽然在内存中存储表数据确实会提供很高的性能,但当mysqld守护进程崩溃时,所有的Memory数据都会丢失。
InnoDB | MyIsam | Memory | |
---|---|---|---|
事务 | √ | × | × |
全文索引 | × | √ | √ |
树索引 | √ | √ | √ |
哈希索引 | × | × | √ |
数据缓存 | √ | × | N/A |
外键 | √ | × | × |
索引
锁
MVCC
事务
日志系统
参考链接
- https://blog.csdn.net/longjialin93528/article/details/80693748
- https://blog.csdn.net/qq_35371323/article/details/110087637
- https://cloud.tencent.com/developer/article/1383465