1.为什么选择B+Tree
1.二叉树了解 → Indexing → Binary Search Trees
3.完全平衡二叉树(AVL Tree) 整个树的高度差不会超过1
4.1.二叉树太深了:数据所处的(高)深度决定着IO操作次数,IO操作耗时大
4.2.1.二叉树太小了:每一个磁盘块(节点/页(一页4K大小))保存的数据量太小了(mysql的一页为16K)
4.2.2.没有很好的利用操作磁盘IO的数据交换特性,也没有利用好磁盘IO的预读能力(空间局部性原理),从而带来频繁的IO操作
5.B+Tree(多路平衡查找树)
5.1. 2-3树了解
5.2.一个磁盘至少可以保存多少个关键字(若一个关键字4byte+冗余空间约4byte,16k*1024/8)
5.3.左闭合区间来计算取哪一路数据,非叶子节点不保存数据相关信息,只保存关键字和子节点的引用,关键字对应的数据只保存在叶子节点
5.4.叶子节点是顺序排列的,并且相邻节点具有顺序引用的关系
5.5.B+优点: 1.扫库、表能力更强,2.磁盘读写能力更强,3.排序能力更强,4.查询效率更加稳定
2.B+Tree在两大引擎中如何体现
查看表结构:show create table 表名;
如:ENGINE = Innodb
数据存储路径:show variables like 'datadir';
cd 库
1.Myisam:数据存储在table.MYD文件中,索引存储在table.MYI中,表定义存储在table.frm中
多索引时,存在多个索引数据,通过各自的索引查找索引位置,然后通过引用取得相对应的数据
2.Innodb:数据、索引存储在table.IBD文件中,表定义存储在table.frm中
多索引时,存在主键索引与辅助索引,查询辅助索引时,通过辅助索引查找到对应的主键,然后通过主键索引查找到主键所在位置的数据
3.索引知识补充
1.聚集索引:数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同
2.列的离散性count(distinct col):离散性越高,选择性越好
3.联合索引:1.经常用的列优先(最左匹配原则)2.离散度高的列优先,3.宽度小的列优先(最少空间原则)
4.覆盖索引:如果查询列克通过索引节点中的关键字直接返回,则该索引称之为覆盖索引,覆盖索引可减少数据库IO,将随机IO变为顺序IO,可提高查询性能
4.总结及验证
1.执行计划语句:explain select * from table;
2.所用指定的列,少用select * ;
3.联合索引中如果查询中有某个列的范围查询,则其右边的所有列都无法使用索引;
如a,b联合索引select * from table where a > 1 and b = 2;只能用到a索引