索引
是帮助mysql高效获取数据的排好序的数据结构
索引数据结构
二叉树:对于单边增长的数列插入不能增加效率
红黑树:当一边的数高度远大于另一边的时候,会自动平衡
如果数据为千万级,树会很高,依然有可能会和磁盘进行多次IO,因此引出B树
B-Tree:
从左到右依次递增
每个子节点都存储data
B+树:
非叶子节点不存储data
叶子节点用指针连接,提高区间访问的性能
为什么mysql采用B+树
一个节点大概是16KB
以三个节点为例:
第一个节点大概可以放下1179个元素
第二个节点同上,
第三个节点因为要存储数据,大概可以存放16个元素
所以能存放的数据1179*1179*16约等于2千万条
相对的B数大约能存放的数据条数为 16*16*16约等于8000
总的来说:首先从存储的数据来说,B树每个叶子节点都会存储数据,因此它的每个节点至多可以存放16个元素,如果对于千万级数据来说,进行的磁盘IO数比B+树多很多
为什么不把所有的数据都放在第一个节点当中?
第一个节点是一定会放在内存当中的
在内存当中定位某个数值,不耗费什么性能,只有磁盘IO耗费性能
数据太大(千万级)会把内存撑爆,而且数据太多的话也不会让我们查询的速度加快
数据、表、索引都是存储在磁盘上面的
MyISAM索引文件是非聚集索引
.frm:表结构
.MYI:mysql中索引存放的文件地址
.MYD:mysql中表数据存储的文件地址
在mysql中查询的顺序
首先是根据条件项去MYI索引中查询,拿到对应的磁盘文件地址,再去MYD文件中找到对应行
InnoDB表
.frm:表结构
.idb:整张数据的所有数据都是按照B+树来组织的,索引存储所在行的其他列
聚集索引:叶子节点会包含完整的数据记录
为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
.idb文件存储数据的时候就是用B+树来组织,它会从第一列开始寻找从头到尾数据都不同的一列当做索引,如果没有主键的话,它就会帮你建一个隐藏列
为什么要是整型的呢?
数字比大小快是比字符串比大小快的其次占用的内存相对小
为什么是自增的呢?
插入非自增的话,会导致树分裂,再做平衡,会导致效率变低
Hash索引
对索引的key进行一次hash计算就可以定位出数据存储的位置
很多时候Hash索引要比B+树索引更高效
坏处:
仅能满足“=”,“in”不支持范围查询
Hash冲突的问题
聚集索引和非聚集索引哪个速度快?
聚集索引效率高
非聚集索引:即需要再查询一次
整张表只有一个聚集索引,建了主键的话,主键就是索引,没有主键的话就会自动生成的rowid索引
为什么非主键索引结构叶子节点存储的键是主键值
一致性和为了节省存储空间
联合索引
多个索引组合成一个索引
索引最左前缀原理
当你需要使用联合索引的时候,你需要把最左边的索引先调用
为什么mysql是索引最左前缀原则
索引是排好序的数据结构