天天看点

Mysql-索引详解

Mysql索引详解

      • 1. 为什么Mysql底层选择B+树作为数据结构?
      • 2. Mysql索引节点
      • 3. 存储引擎
      • 4. myisam引擎内容
      • 5. InnoDB引擎内容
      • 6. 索引优化

1. 为什么Mysql底层选择B+树作为数据结构?

1. 二叉树:容易转换为链表。
2. 红黑树:数据层数太高。(二叉平衡树)
3. B+ Tree: 多叉平衡树。 索引节点是从左向右升序排列。
	1.  
4. B- Tree
	1. 叶节点具有相同的深度,叶节点的指针为空。
	2. 所有索引元素不重复。
	3. 节点中的数据索引从左至右递增排列。
           

2. Mysql索引节点

1. 一个索引节点分配16KB大小。
2. 索引数据和区间索引地址(两个索引节点之间的数据所在的内存地址)构成。
3. MySQL根节点索引是常驻在内存中。
4. 每一次IO操作,都会获取一个索引节点。
           

3. 存储引擎

1. 存储引擎是针对数据表,不是针对数据库的一个库中可以存储不同存储引擎的数据表。
           

4. myisam引擎内容

  1. 存储数据相关文件:
    1. tableName.frm:存储table的表结构。
    2. tableName.MYD:存储table中的数据。
    3. tableName.MYI:存储table的索引。
  2. 查询的过程
    1. 没有索引:直接进行全表扫描。
    2. 存在索引:
      1. 查找索引(MYI文件)。
      2. 根据索引中存储的数据内存地址,在(MYD文件)查找数据。
      3. 加载到内存中。
  3. 索引(非聚集索引)
    1. 索引文件和数据文件是分离的。
    2. 索引的叶子节点,存储的是数据所在的内存地址。
      Mysql-索引详解

5. InnoDB引擎内容

  1. 存储数据相关文件:
    1. tableName.frm: 存储table的表结构。
    2. tableName.ibd:存储table的索引以及数据。
  2. 面试题
    1. 为什么InnoDB建议,必须建立主键,并且推荐使用整型的自增主键?
      1. InnoDB底层会根据主键,组建B+Tree的数据。
      2. 没有建立主键时,InnoDB会在底层寻找一个不重复数据的列,作为主键索引,构建B+Tree的数据组成。若找不到合适列,Mysql会新建一个隐藏列,作为主键索引,构建B+Tree的数据组成。
      3. 推荐使用整型;是因为整型占用的存储空间小,且容易比较大小(因为B+Tree是保证索引节点,是从左到右,依次递增)。
      4. 使用自增;若主键时随意大小,那么会导致,叶子节点会进行分裂,且B+Tree会进行自平衡,降低效率。
    2. BTree和B+Tree的区别?
      1. Btree叶子节点没有关联;
      2. B+Tree叶子节点之后是使用双向链表结构,互相关联在一起的。
  3. Hash索引
    1. 定义:根据查找语句的字段,进行hash运算,得到磁盘对应的行存储地址 。
    2. 优势:对于=这样的可以快速查询。
    3. 劣势:对于> or < 等等这种区域操作,则无法快速查询数据。
  4. 索引(聚集索引):
    1. 索引文件和数据文件是在一起的。
    2. 索引的叶子节点,存储的是对应索引的行完整数据。
    3. 聚集索引定义:就是索引的叶子节点,存储的就是完整数据行。
    4. 叶子节点是数据结构是双向指针;方便进行范围的查找。
      Mysql-索引详解
      Mysql-索引详解

6. 索引优化

  1. 联合索引的底层数据结构是怎么样的?
    1. 索引节点中,就会存储多个字段的数据;然后数据节点中存储其余的字段数据。
    2. 比较大小:会一个一个字段进行比较,若第一个字段就能比较出大小,则不会进行后面字段的比较;因此,当我们使用索引时,若查询的字段顺序,不符合索引字段的顺序,则无法使用索引。 eg: key(a, b, c); where b == 1 and a == 2 and c==1, 依然会被Mysql底层,优化使用到索引。除非,where中不含a开头,就会无法使用索引。
      Mysql-索引详解

继续阅读