弄懂mysql数据库的索引原理和底层
一、从二叉树到B+树
二、mysql的存储引擎->聚集索引和非聚集索引
三、mysql的索引分类->数据结构、物理存储、逻辑结构
一、树:
1、满二叉树
2、完全二叉树
3、二叉搜索树:
4、平衡二叉树:
5、红黑树:TreeMap使用的数据结构
6、B树、B+树
B树:2k-1个key,2k个孩子,最少t-1个key
在大量数据进行存储的时候会存储到外部磁盘,通过对外部磁盘的读取时需要快速的查找到对应的位置,B树就是为了存储设备或者磁盘设计的一种平衡二叉树
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VQ1Mxy6r-1570974749680)(C:\Users\晓\AppData\Roaming\Typora\typora-user-images\1570947266045.png)]
1)、构造:
/**
* B树中的节点。
*/
private static class BTreeNode<K, V> {
/**
* 节点的项,按键非降序存放
*/
private List<Entry<K, V>> entries;
/**
* 内节点的子节点
*/
private List<BTreeNode<K, V>> children;
/**
* 是否为叶子节点
*/
private boolean leaf;
/**
* 键的比较函数对象
*/
private Comparator<K> kComparator;
private BTreeNode() {
entries = new ArrayList<>();
children = new ArrayList<>();
leaf = false;
}
...B+树:
1)、B+树是B树的一张变形,它把数据都存储在叶子节点,内部只存关键字(其中叶叶子节点的最小值作为索引)和孩子指针,简化了内部节点
2)、B+树的遍历高效,将所有叶子节点串联成有序链表即可从头遍历
(叶子几点形成有序链表,便于范围操作)
分析:为什么B+树比B树更适合做系统的数据库索引和文件索引
1)B+树的磁盘读写代价更低
因为B+树内部节点没有指向关键字具体信息的指针,内部节点相对B树小
2)B+树的查询更加稳定
因为非终端结点并不是指向文件内容的结点,仅仅是作为叶子结点的关键字索引,因此所有的关键字查询都会走一条从根节点到叶子结点的路径。即s所有关键字查询的长度是一样的,查询效率稳定。
二、mysql数据库的存储引擎:
MYISAM引擎:
建立表格时生成3个文件:user.myi:索引文件、user.myd:数据文件、user.frm数据结构类型
当我们执行 select * from user where id = 1的时候,它的执行流程:myi->索引树->叶子节点(索引和数据地址)->myd数据文件中找出对应数据
(1)查看该表的myi文件有没有以id为索引的索引树。
(2)根据这个id索引找到叶子节点的id值,从而得到它里面的数据地址。(叶子节点存的是索引和数据地址)。
(3)根据数据地址去myd文件里面找到对应的数据返回出来。innodb引擎(聚集索引):
默认使用主键索引,所以只生成frm文件和ibd索引文件,叶子节点存的是主键索引和数据信息
如果建立其他索引,例如name时,索引过程:
建立name索引树,叶子节点存储的是索引和主键值
ibd找到索引树->根据name值找到该树下叶子的name索引和主键值->使用主键索引树去叶子节点下得到该条数据信息
总结:关于innodb和myisam中索引的使用:
1、不宜使用过长的字段作为主键(二级索引)
2、因为Innodb本身是一棵B+树,非单调的 主键会造成在插入新纪录时数据文件为了维持B+树的特性而频繁的分裂调整,使用自增的字段作为主键比较合适
3、Myisam:在使用文本索引时候比较有优势
三、mysql索引的分类:
从数据结构角度:
1、B+Tree索引
2、hash索引:一次定位:只有 Memory存储引擎才能支持hash索引
3、fullText索引:全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题,尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。
?4、R-Tree索引:(空间索引)(用于对GIS数据类型创建SPATIAL索引)
从物理存储角度:
1、聚集索引(clustered index):该索引中键值的逻辑顺序决定了表中相应行的物理顺序。即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。
2、非聚集索引(non-clustered index):必须先查到目录中查到每一项数据对应的页码,然后再根据页码查到具体内容,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。记录的物理顺序与逻辑顺序没有必然的联系
聚集索引一般用于搜索范围值的列
非聚集索引用于涉及到大数据量的排序、全表扫描、count之类的操作的话
备注:每个表只能有一个聚集索引,因为一个表中的记录只能以一种物理顺序存放,但是一个表中可以有多个非聚集索引,非聚集索引会耗费大量的内存和硬盘空间,非聚集索引可以提高从表中读取数据的速度,但是降低从表中插入和更新数据的速度(因为改变一个简历了非聚集索引的表中的数据时,必须同时更新索引)
从逻辑角度:
1、普通索引或者单列索引
2、唯一索引/非唯一索引
3、主键索引:
4、多列索引
5、空间索引:
非聚集索引会耗费大量的内存和硬盘空间,非聚集索引可以提高从表中读取数据的速度,但是降低从表中插入和更新数据的速度(因为改变一个简历了非聚集索引的表中的数据时,必须同时更新索引)
从逻辑角度:
1、普通索引或者单列索引
2、唯一索引/非唯一索引
3、主键索引:
4、多列索引
5、空间索引:
不用乱,以上索引默认使用B+tree数据结构
















