mysql 分为4层结构:
连接层:负责处理链接,鉴权,安全。
服务层:负责sql接口,sql分析,sql优化,sql缓存。
引擎层:负责执行服务层的操作,不同的引擎拥有不同的特性。(索引在该层)
存储层:将数据存储到文件上。
输入 show engine; 可以查询到mysql 支持的存储引擎:
目前只有 InnoDB 支持 事务 。
mysql 5.5之后默认使用的就是 innoDB
想设置其他引擎可以在创建表时末尾设置 engin = xxxx:
InnoDb:默认的引擎,如果需要支持事务和外键,那就是唯一的选择。
MyISAM: 读取速度快,更新速度慢,不支持事务,已经被 mogoDB取代。
Memory:数据只存在内存中,已经被redis 取代。
一、什么是数据库索引:
索引(index)是帮助数据库提高获取数据效率的数据结构
例如:下面的数据为例,当要查找45时。如果全文检索,从上到下需要比对7次,如果二叉树索引只需要2步就差查询到结果。
索引的数据结构
数据结构的特点
数据结构的进化:
1、二叉树: 顺序插入时,会导致层级较深。
2、红黑树:(平衡二叉树)会自平衡,但是在大数据量情况下,层级也会很深。
3、B-tree (多路平衡查找树)下面的例子是 5阶的B-tree,B树的缺点是,顺序查找速度慢。
4、B+树(重点)
1、所有数据都保存在叶子节点中:非叶子节点仅用于索引,不保存数据记录,这样可以提高查询性能,因为查找任何数据都必须从根节点遍历到叶子节点。
2、叶子节点之间通过链表连接:所有叶子节点按关键字的大小顺序链接,形成一个有序链表,这有利于范围查询和顺序访问。
3、更高的分支度:相较于B树,B+树每个节点可以存储更多的关键字,减少了树的高度,从而减少了磁盘I/O次数,提高了查询效率。
4、顺序访问性:由于叶子节点通过链表连接,B+树支持顺序遍历,这对于需要顺序访问数据的场景非常有用。
5、适应磁盘读写:B+树的节点大小通常与磁盘页的大小相同,这使得B+树能够很好地适应磁盘读写操作,减少磁盘I/O开销。
B+Tree在线演示地址:https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
B+tree 存放数据的查询效率问题
高度为2 时: 如果主键是bigint 1171 *16 = 18736 条数据 如果不 int 就是4个字节还可以翻倍
高度为3 时: 1171 * 1171 *16 = 21939856 大概2千多万条数据。所以通过主键查询效率很高。
Hash 索引:
hash索引就是采用hash算法,将key value 存储到hash 表中,如果有hash冲突就,用链表的方式解决。
有点单个数据查询速度快,但是不支持范围查询,不支持排序操作。 同理于 hashMap 和 redis