一、索引
1. 什么是索引
索引是帮助MySql高效获取数据的排好序的数据结构。
2.索引的数据结构
① 二叉树(Binary tree)
定义:是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树。
特点:左子树小于父节点的值,右子树大于父节点的值。
缺点:当列的值是自增时,会出现单边树,退化成链表结构。(故mysql没有采用该数据结构)
② 红黑树
平衡二叉树,解决了二叉树树里面的单边退化成链表的问题。
缺点:如果针对海量数据时,树的高度不可控。查询的性能也提升不明显。(故mysql没有采用该数据结构)
③ Hash表(mysql支持)
特点:1. 对索引的key进行一次hash计算就可以定位出数据存储的位置
2. 很多时候Hash索引要比B+ 树索引更高效(例如 =,in )
3. 不支持范围查询
4. hash冲突问题
④ B-Tree
特点:1. 叶节点具有相同的深度,叶节点的指针为空
2. 所有索引元素不重复
3. 节点中的数据索引从左到右递增排列
为什么mysql没有采用B-Tree?
1. 非叶子节点可以存放的索引数据少,比如,要控制在树高度为三层的情况下,存放不了太多数据。
2. 范围查询的效率低。
⑤ B+Tree(MYSQL采用的数据结构,当然不是最原生的B+树,还是做了一些优化后的B+树)
特点: 1. 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
2. 叶子节点包含所有索引字段
3. 叶子节点用双向指针连接,提高区间访问的性能
数据结构描述:1. 通过冗余索引设计,以上图为例,假如三层高度树,第三层存放的整张表的所有索引和数据。
2. 第二层存放的是第三层每页数据的最小的索引,第一层又是从第二层的页索引数据中提取最小的进行冗余。
3.索引的分类:
① 聚簇索引(叶子节点包括完整的数据记录,索引和数据)
例如: INNODB的主键索引树
② 非聚簇索引(索引和数据是分开的)
例如:MYISAM的主键索引树、INNODB二级索引
③ 主键索引(一张表只有一个主键索引)
④ 二级索引(非主键索引)
⑤ 联合主键索引(唯一)
⑥ 联合辅助索引(可以不唯一)
二、存储引擎
MySQL表文件都是存放在磁盘中的。存储引擎作用的维度是表。
1. MYISAM
在磁盘中存放的是三个文件,分别为:xxx.frm(表结构)、xxx.MYD(数据)、xxx.MYI(索引)
2. INNODB
在磁盘中存放的是两个文件,分别为:xxx.frm(表结构)、xxx.ibd(数据加索引)