1、索引是帮助MySQL高效获取数据的排好序的数据结构
2、索引数据结构
二叉树
红黑树:二叉平衡
Hash表:
-
-
- 对索引的key进行一次hash计算就可以定位数据存储的位置
- 很多时候Hash索引要比B+Tree索引更高效
- 仅能满足 “=” “in”,不支持范围查询
- hash 冲突问题
-
B-Tree:
-
-
- 叶节点具有相同的深度,叶节点的指针为空
- 所有索引元素不重复
- 节点的数据索引从左到右递增排列
-
B+Tree
-
-
- 非叶子节点不存储data(每一行数据磁盘文件地址),只存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能
-
存储引擎:
MyISAM 索引文件和数据文件是分离的(非聚集)。体现为一张数据表有三个存储文件
InnoDB 聚集索引。体现为一张数据表有2个存储文件
表数据文件本身就是按照B+Tree组织的一个索引结构文件
聚集索引——叶节点包含了完整的数据记录
注:InnoDB 推荐使用整形的自增主键。不建主键会自动建一个隐藏主键列
使用innodb引擎的时候页大小默认是16K(常驻内存)
SHOW GLOBAL STATUS LIKE 'Innodb_page_size';
索引查询的效率高是因为树的高度变低了。通常来说B+Tree的层次就是2-4层,上千万的数据量仅需2-4次 I/O 就能准确定位。
叶节点的大小不做修改是默认为16kb,若(冗余)索引为bigint,再加上(连接)指针,即8b+6b=14b(估算),那每个叶节点能容纳的元素个数为:16kb=16*1024b,n=16*1024/14 ≈ 1170,表示叶节点大约可以存储1170个元素。再假设data为1kb,那就是可以容纳16个元素,那么非叶子节点总共就有:1170*1170*16 ≈ 2200万个元素。