索引底层解析

索引的基础代码:

查看代码  show  index  from  表名;

创建索引  create  index  索引名  on  表名(列名);

删除索引  drop  index  索引名  on 表名;

1.为什么要创建索引

举一个形象的例子,没有索引的MySQL数据库,就像一个就像拿着一个字在字典里面一页一页翻,而有索引的就像字典里面的首字母,一下让你找到在多少页,速度快了不止一倍。所以创建索引的最重要的一点就是可以提升查询速度,但唯一不好的就是要浪费空间,但和速度比起来,这点空间可有可无。

2.索引的内容

索引的核心内容就是它的底层数据结构,而那些数据结构可以提升查询速度呢,

有顺序表(随机访问),链表(中间位置增删),栈/队列(特殊位置的操作),树->主要为二叉树。

其中比较卓越的是二叉树中的红黑树还有哈希表,但哈希表只能计算key值相等的情况,hash映射后不能反应计算出来hash值大小关系,所以并不适合数据结构,

红黑树也不适合,因为数据库其中的数据元素有很多,所以会导致树变高,变高之后查询的效率会很底下,因为每次要走一遍,越高越慢,所以也不适合。

3.因此就代入了B树(N叉搜索树)

特点:每个节点上可以存储多个元素,延伸出多个子树,以同样数量的数据,但树的高度大大降低。

每个方框是一个节点,每个数字代表一个key(或者是一行数据库中的记录)

979925b79dfb42e58632941e068d9f45.jpg

 

就好似这种,B树的查找特点:

1.每个节点上的这些key也是有序列的,比较的时候可以直接二分查找

2.B树也会控制,某个节点上保存的key不会太多,如果插入更多的元素,使key变多了,就会再次分裂,弄出更多的子树

3.多个数据,都是放在一块连续的存储空间上,进行比较的时候,一次硬盘io就能读出整个节点,就可以直接完成上述比较

但其实数据库使用的是B+树,B+树中最右边的既为最大数,不能超过,这是和B树的区别,这也是优势,

aa4166acd723429ebdd5da1b07a56481.jpg

 按照这样排列数据,叶子节点这里就可以包含数据集合的全集,然后B+树会把叶子节点串联起来,以链表的结构,这样就方便遍历表中的所有数据,也方便范围查询

B+树的优势:

1.非常方便遍历和范围查询

2.查询时间稳定,因为每一次的查询都要落到叶子节点,时间io是固定的

3.占用空间小,因为到叶子节点是数据的全集,就是表的每一行都关联在叶子节点,这样就可以把非叶子节点只保存单纯的一个key值就可以了。然后把非叶子节点可以缓存在内存中,这样速度可以上一个档次,比硬盘中快很多。

 

 

 

还有重要的一点就是针对索引列进行查询,就是从树根节点往下一层一层的查询

针对非索引列查询,就拿着最底下一层叶子节点,遍历链表就行了。

代码就如

1.走索引的情况:

select  *  from  student  where  id  =  20;

这种就是拿这二十,树根结点来找区块

select  *  from  student  where  id  >  20 and id<100;

这种直接范围查询,速度非常快

2.不走索引的情况:

select * from  student  where  classld = 102;

这种就要拿着102去叶子节点的链表一个一个遍历,会非常慢

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值