一 、为什么mysql索引的数据结构没有选中排序二叉树,红黑树,hash?
1.当数据单边增长的时候排序二叉树树就会退化成链表
2.数据量大时,树的高度过高
3. hash满足不了范围查找
select * from ? where ?<100
二 B+tree
B+tree是Btree的一个变种
与Btree不同的是
1.非叶子节点不存储data,只存存储key(即为Mysql的索引字段)
2.叶子节点直接用双向指针连接,这使得范围查找变得高效
Mysql设置B+tree所有节点的存储空间为16KB
索引字段为8字节,指针为6字节,那么根节点大概能存贮1170对字段+指针,也就是1170个子节点,每个子节的存储空间为16对,假设一个索引元素(Key+data)为1KB,那么根节点的每个孙子节点能存16个索引元素。
那么一个B+tree总共能存储1170X1170X16,大约两千多万个索引元素
如果有索引存在,Mysql在查询操作时,首先将存储索引的B+tree load进内存中,通过二分查找快速的找到索引
三 InnoDB索引实现
1.表数据文件本身就是B+tree结构
2.聚集索引:叶子点包含了完成的表数据 (补充:非聚集索引:叶子节点存储了表数据地址)
3.InnoDB表必有主键,如果建表时不指定主键,mysql会自动选择一列作为主键,如果没有不重复的列,mysql会建一个隐藏列作为主键
4.联合索引:即key存储多个索引字段。
(1) 最左前缀原则:联合索引必须从最左边的索引开始且不跳过索引列,因为检索时候是按索引的顺序依次检索的