mysql索引排序原理_mysql索引底层原理

mysql索引概述

什么是索引

索引是一种高效获取数据的数据结构,提高数据查询效率

索引分类

从存储结构上来划分:B-Tree,B+Tree,Hash索引

从应用层次来分:普通索引,唯一索引,复合索引

从数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引

Mysql 索引底层数据结构选型

Hash索引介绍

hash索引基于哈希表实现,存储引擎会对索引列使用哈希算法,计算一个哈希码(hash code),并且将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针

哈希算法也叫散列算法,就是把任意值(key)通过哈希函数变换为固定长度的 key 地址(十六进制表示),通过这个地址进行具体数据的数据结构,哈希表是一种内存地址映射关系

83eb06fc00a1?utm_campaign=shakespeare

哈希索引.png

哈希表查找过程:

表中一共有 7 个数据,我们需要检索 id=7 的数据,SQL 语法是:

select * from user where id=7; 哈希算法首先计算存储 id=7 的数据的物理地址 addr=hash(7)=4231,而 4231 映射的物理地址是 0x77,0x77 就是 id=7 存储的数据的物理地址,通过该独立地址可以找到对应 user_name='g'这个数据。这就是哈希算法快速检索数据的计算过程。在查找 id=7 的数据,哈希索引只需要计算一次就可以获取到对应的数据,检索速度非常快。但是 Mysql 并没有采取哈希作为其底层算法,因为考虑到数据检索有一个常用手段就是范围查找,比如以下这个 SQL 语句:select * from user where id >3;

在范围查找过程中,简单的实现思路就是一次把所有数据找出来加载到内存,然后再在内存里筛选筛选目标范围内的数据。这种查找效率低,不能对数据高效范围查找,因此哈希索引是不适合作为 Mysql 的底层索引的数据结构。

83eb06fc00a1?utm_campaign=shakespeare

哈希索引.jpg

哈希不支持 范围查询 ,不能做排序

mysql默认的存储引擎是Inodb,对于频繁访问的表,innodb会建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端,不可控制的,隐式的。

哈希存储时会降低磁盘利用率

二叉树

二叉树的特点:

一个节点只能有两个子节点,也就是一个节点度不能超过2

左子节点 小于 本节点,右子节点大于等于 本节点

83eb06fc00a1?utm_campaign=shakespeare

二叉树.jpg

在二叉树结构,计算比较 3 次就可以检索到 id=7 的数据,相对于直接遍历查询省了一半的时间,从检索效率上能做到高速检索的。此外二叉树的结构还能提供的范围查找功能,上图二叉树的叶子节点都是按序排列的,从左到右依次升序排列,如果我们需要找 id>5 的数据,那我们取出节点为 6 的节点以及其右子树就可以了,范围

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值