MySql的存储引擎,常用的有三种: InnoDB、MyISAM、 MEMORY
。
三种储存引擎的特点和选择
MyISAM
-
特点:不支持事务和外键操作。读取速度快,节约资源。
-
使用场景:以
查询操作为主
,只有很少的更新和删除操作,对事务的完整性、并发性要求不是很高!
InnoDB
-
特点: MySQL的默认存储引擎,支持事务和外键操作。
-
使用场景:
对事务的完整性
有比较高
的要求
,在并发条件下要求数据的一致性
,读写频繁
的操作!
MEMORY
-
特点:将所有数据保存在内存中,在需要快速定位记录和其他类似数据环境下,可以提供更快的访问。
-
使用场景:通常
用于更新不太频繁的小表,用来快速得到访问的结果
!
三者特性对比
-
MylSAM存储引擎:
访问快,不支持事务和外键操作
。 -
InnoDB存储引擎:
支持事务和外键操作,支持并发控制,占用磁盘空间大
。(MySQL 5.5版本后默认) -
MEMORY存储引擎:
内存存储,速度快,不安全
。适合小量快速访问的数据。
索引
MySQL索引
:是帮助MySQL高效获取数据的一种数据结构。所以,索引的本质就是数据结构
!
在表数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构上实现高级查找算法这种数据结构就是索引
。
按照功能分类
-
普通索引
:最基本的索引,没有任何限制。 -
唯一索引
:索引列的值必须唯一, 但允许有空值。如果是组合索引,则列值组合必须唯一。 -
主键索引
:一种特殊的唯一索引, 不允许有空值。在建表时有主键列同时创建主键索引。 -
联合索列:
顾名思义,就是将单列索弓l进行组合。 -
外键索引
:只贿InnoDB引擎支持外键索引,用来保证数据的一致性、完整性和实现级联操作。 -
全文索引
:快速匹配全部文档的方式。InnoDB 引擎5.6版本后才支持全文索引。MEMORY 引擎不支持。
按照结构分类
-
BTree索引
: MySQL使用最频繁的一个索引数据结构,是InnoDB
和MylSAM
存储引擎默认的索引类型
,底层基于B+Tree数据结构
。 -
Hash索引
: MySQL中Memory
存储引擎默认支持的索引类型。MySQL中,只有Memory存储引擎显示支持hash索引,是Memory表的默认索引类型,尽管Memory表也可以使用B-Tree索引。
索引的原理
BTree(InnoDB和MyISAM)
- BTree索引类型是
基于B+Tree数据结构
的 B+Tree
数据结构又是BTree
数据结构的变种
。通常使用在数据库和操作系统中的文件系统- 特点是能够
保持数据稳定有序
。
磁盘存储
-
系统从磁盘读取数据到内存时是
以磁盘块( block )为基本单位
的。 -
位于
同一个磁盘块中的数据会被一次性读取出来
,而不是需要什么取什么。 -
InnoDB存储引擎中有页( Page )的概念,
页是其磁盘管理的最小单位
。InnoDB
存储弓|擎中默认每个页
的大小为16KB
。 -
InnoDB弓|擎
将若干个地址连接磁盘块
,以此来达到页的大小16KB -
在查询数据时,一个页中的
每条数据都能有助于定位数据记录的位置
,这将会减少磁盘I/O次数,提高查询效率
。
BTree
在每一个结点上除了去保存键值
以外,还会去保存真实的数据
,在进行查询数据时,只要涉及到相应的磁盘块,那这些数据也会被全部读取出来,所以导致效率不是很高。
B+Tree
特点:
在分支结点
上只保存键值
,并`没有真实的数据,```真实的数据只会保存在叶子结点上``
在磁盘块上并没有涉及到IO操作,提高了查询的特点
叶子结点之间进行连接,方便进行范围的查询
区别
BTree数据结构
- 每个节点中不仅包含key值,还有数据。会增加查询数据时磁盘的I0次数。
B+Tree数据结构
-
非叶子节点只存储key值。
-
所有数据存储在叶子节点。
-
所有叶子节点之间都有连接指针。
B+Tree好处
-
提高查询速度。
-
减少磁盘的I0次数。
-
树型结构较小。
Hash索引(Memory)
Memory存储引擎支持非唯一hash索引,如果多个值有相同的hash code,索引把它们的行指针用链表保存到同一个hash表项中。
Hash索引的限制:
- 索引仅包含hash code和记录指针
- Hash索引不支持键的部分匹配,因为是通过整个索引值来计算hash值的。
- 不能使用hash索引排序。