Q1: 为什么用了mysql的索引之后查询会加快?
Q2: 索引越多越好嘛?
Q3: 索引的数据结构是什么样的,特点是什么?
Q4: 二叉树, HASH,BTree 为什么选择Btree?
回答Q1
不用索引查询的时候,如果有100条记录,那么当我查询一条记录的时候,最坏情况就需要在数据库中进行100此比对,数据了越大增长越快;
当用了索引之后,索引的数据结构是一棵树,这样查找的时候,会二分查找,复杂度为log(n)2,那么就会很快;
回答Q2
当然不是,每个索引的建立都以为着要维护一棵B+tree树,每次数据的DML操作,都会引起树的变动,索引很多DML操作就会很慢;
回答Q3
回答Q4
二叉树: 左边节点小于上级,右边大于上级,当数据为递增或者递减的时候,如果创建索引,那么会形成一个链: 例如
image.png
这样就相当于没有索引了,根本没有减少查找数据的io次数;
红黑树: 也是二叉树,但是它解决了上面的问题,它其实是二叉平衡树,会减少树的深度
例如:
image.png
HASH: 类似于hashmap的数组加链表,但是链表不会变为树的结构
BTree:
image.png
存储数据后会以字段中的值作为key,然后以数据所在存储位置的指针作为value存储,逼数的特点就是 尽量延伸节点的宽度,打到快速查找的目的,并且高度尽量控制在1-5之间,这样查询的时候,当找到了一个节点后,直接查到内存中,在内存中查找数据;
B+Tree : 与BTree 的不同点为他存储数据的时候,没有value 只有key,然后层级之间有指针指向,指针的作用是????? 这样方便范围的查找,当没有指针的时候,要再次回到顶级节点然后再次查找
image.png
例如查找大于3
关键索引值做了冗余,叶子节点上去掉了数据,而所有非叶子节点上带数据,为什么????
因为: 相同的空间,可以横向扩展更多的数据,这样就会减少树的高度,这样就会加快查询;
当为Innodb引擎的时候,表中的主键索引即为B+Tree,里面的数据变为了索引加数据的存储结构,这样根据索引找到后,可以直接拿到数据(此种索引也叫聚集索引); 而 MyIsam的存储的是该条数据的存储地址,在通过磁头找到该条数据;
SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; -- 16k 大小
BTree非叶子节点每次获取数据最大的大小
=============================================================
为什么组合索引遵循最左原则?这是由B+tree树决定的
二叉树,红黑树,B tree,B+tree