1.1 索引的概念
索引是帮助MySQL高效获取(排好顺序)数据的数据结构。
1.1.1 索引数据结构
-
二叉树
-
红黑树
-
Hash表
-
B-Tree
1.1.2 二叉树
二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。
缺点:
比如插入元素为: 1 2 3 4 5 6 7,二叉树的结构会变成链表,查询数据时,逐行查找,效率慢
1.1.3 红黑树
红黑树(Red Black Tree) 是一种自平衡二叉查找树,一种数据结构。
缺点:
红黑树结构的表结构, 如果存储的数据量很大,红黑树树的高度也很大,如果要查询的数据在红黑树的叶子节点,那么查询的效率会很慢。
改进:
扩展单个节点存储的索引个数,存储越多,树的高度越小
1.1.4 B-Tree ( 单个节点存储多个索引)
-
叶节点具有相同的深度,叶节点的指针为空
-
所有索引元素不能重复
-
节点中的数据索引从左到右递增
-
节点大小 16K
查询时将节点加载到内存中,对元素进行比较,如果元素比某个索引小,则再将该索引的左子树加载到内存再进行比较。
1.1.5 B+Tree
B+Tree 是在B-Tree上的一种优化, InnoDB存储引擎就是B+Tree实现的
B+Tree 与 B-Tree 有什么不同?
-
非叶子节点不存储data,只存储索引,可以放更多的索引
-
所有叶子节点之间都有一个链指针,可以提高区间访问的性能
-
数据记录都存储在叶子节点中
1.1.6 Hash表
将每一个元素做一次哈希计算,确定存储位置。
缺点:
适合于等值数据查找,但不适合于范围查找
1.2 存储引擎
MySQL中数据用各种不同的技术存储在文件(或内存)中,这些技术使用不同的存储机制、索引技术、锁定水平。
1.2.1 存储引擎分类
-
myisam (非聚集)
myisam索引文件和数据文件时分离的(非聚集),查询时会跨越两个文件
数据存储结构
一张表有三个文件:如t_song表
t_song.frm:存储的是数据表的基本结构
t_song.MYD:存储数据表的记录
t_song.MYI:存储数据表的索引
-
innodb (实现了聚集索引)
-
MySQL默认的存储引擎,支持ACID事务
-
数据文件本身就是按照B+Tree构建的索引结构文件
数据存储结构
一张表只有两个文件,如t_log:
t.log.frm 数据表的基本结构
t.log.idb 数据表的索引和记录
聚集索引
聚集索引,叶子节点包含了完整的数据记录
-
1.2.2 为什么InnoDB必须有主键,并且推荐使用整型的自增主键?
-
有主键才可以构建B+Tree索引结构。
-
数据查找时,会将索引加载到内存中进行大小比较,整型相对其他的字符类型较为合适,因为字符类型的比较是一个字母、一个字母的比较。
1.2.3 为什么B+Tree会有一个链指针?
为了满足范围数据查找的需求,为了更好的定位下一个数据位置。