Mysql索引底层数据结构与算法

一.索引概述
是什么:
索引是帮助MySQL高效获取数据的排好序的数据结构,索引叫”键”,优化好一个索引,可以提高数倍的性能, 类似于字典的音序表
为什么要键索引:
目的在于提高查询效率,通过不断的缩小要获取数据的范围来筛选最终的结果,把随机的事件变为顺序事件.

二.索引数据结构
1.二叉树
二叉树是一种非线性结构。只有一个根节点,每一个数据结点上最多只有左右两颗子树.它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;活着左、右子树皆为空。

Mysql索引底层数据结构与算法

2.红黑树
红黑树解决了二叉查找树多次插入新节点可能导致的不平衡问题,红黑树是一种自平衡的二叉查找树

Mysql索引底层数据结构与算法
3.Hash
是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度.这个映射函数称做散列
函数,存放记录的数组称做散列表。哈希表(Hash Table)其实也叫散列表.哈希表可以用来高效率解决元素不可重复这个问题,其本质就是:数组+链表+红黑树
Mysql索引底层数据结构与算法
4.B-Tree
是一种平衡的多路查找树.叶节点具有相同的深度,叶节点的指针为空,所有索引元素不重复,节点中的数据索引从左到右递增排列
Mysql索引底层数据结构与算法
5.B+Tree(B-Tree变种)
是常用于数据库和操作系统的文件系统中的一种用于查找的数据结构, 是对b树的优化.非叶子节点不存储data,只存储索引(冗余),可以放更多的索引.叶子节点包含所有索引字段.叶子节点用指针
连接,提高区间,随着数据量变大,主要是控制树的高度才能提高效率
访问的性能
Mysql索引底层数据结构与算法
6.mysql索引选择
Mysql索引可以选hash和b+树, hash比b+树运算块, 但是现在公司主要用b+树, 因为hash对范围查找不支持,只是支持等值查找,还存在hash冲突问题。b+树有双向指针,更好的支持范围查找。

三.存储引擎索引实现
1.MyISAM索引文件和数据文件是分离的(非聚集)

Mysql索引底层数据结构与算法

2.InnoDB索引实现(聚集)
表数据文件本身就是按B+Tree组织的一个索引结构文件
聚集索引-叶节点包含了完整的数据记录
为什么建议InnoDB表必须建主键,并且推荐使用整型的自增主键?
为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)

Mysql索引底层数据结构与算法
Mysql索引底层数据结构与算法

四.索引最左前缀原理
在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配

Mysql索引底层数据结构与算法

Original: https://www.cnblogs.com/dy199/p/16079510.html
Author: 红叶舞秋山白羊
Title: Mysql索引底层数据结构与算法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601345/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 深入浅出分析 HashMap

    作者:炸鸡可乐原文出处:www.pzblog.cn 一、摘要 在集合系列的第一章,咱们了解到,Map的实现类有HashMap、LinkedHashMap、TreeMap、Ident…

    数据库 2023年6月14日
    072
  • Java泛型用法总结

    普通泛型 <span class="kwd"><span class="kwd">class<span cla…

    数据库 2023年6月16日
    068
  • MySQL8自增主键变化

    MySQL8自增主键变化 醉后不知天在水,满船清梦压星河。 一、简述 MySQL版本从5直接大跃进到8,相信MySQL8一定会有很多令人意想不到的改进,如果不想只会CRUD可以看看…

    数据库 2023年6月14日
    084
  • 实现线程的两种方式

    实现Runnable接口如果当前类 不仅要继承其他类( 非Thread类), 还要实现多线程,那么 只能通过当前类实现 Runnable接口来 创建Thread类对象。 实现Run…

    数据库 2023年6月16日
    0116
  • SQL Server解惑——为什么你拼接的SQL语句换行符失效了?

    –========================================================================================…

    数据库 2023年6月11日
    084
  • LIMIT和OFFSET分页性能差!今天来介绍如何高性能分页

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 前言 之前的大多数人分页采用的都…

    数据库 2023年6月11日
    0127
  • 前后端数据交互利器–Protobuf

    Protobuf 介绍 简而言之,Protobuf 是 Google 开源的一款用于处理前后端数据交互格式的工具。通常来讲前后端使用的编程语言是不同的,使用 Protobuf无需多…

    数据库 2023年6月16日
    099
  • 从join的实现窥探MySQL迭代器

    以如下left join查询语句为范例: select * from t1 left join t2 on t1.c=t2.a ; 以下初始化数据: 1 DROP TABLE IF…

    数据库 2023年6月11日
    099
  • Matplotlib(基本用法)

    Matplotlib 是数据分析绘图的常见模块,可以算是 2D-绘图(Python)领域使用最广泛的套件,可以将数据图形化,并且提供多样化的输出格式,利于数据的显示并分析。 接下来…

    数据库 2023年6月16日
    097
  • springmvc静态资源配置

    <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>o…

    数据库 2023年6月16日
    094
  • MySQL 中如何归档数据

    归档,在 MySQL 中,是一个相对高频的操作。 它通常涉及以下两个操作: [En] It usually involves the following two actions: …

    数据库 2023年5月24日
    091
  • 第十三章 后置处理Bean

    BeanPostProcessor: 对Spring工厂所创建的对象,进行再加工 注意: BeanPostProcessor是一个接口 程序员实现BeanPostProcessor…

    数据库 2023年6月14日
    077
  • JavaWeb-MVC、过滤器

    一、MVC架构图 Model 业务处理:业务逻辑(Service) 数据持久层:CRUD(Dao) View 展示数据 提供连接发起Servlet请求(a,form,img&#82…

    数据库 2023年6月16日
    0107
  • 详解Threejs中的光源对象

    光源的分类 AmbientLight(环境光), PointLight(点光源), SpotLight(聚光源) 和 DirectionalLight(平行光)是基础光源 Hemi…

    数据库 2023年6月11日
    0108
  • 为Typora配置Gitee图床

    安装Typora 官网下载直接安装:https://www.typora.io/#download 编辑Typora图像设置 说明: 打开:文件–>偏好设置&#8…

    数据库 2023年6月11日
    0158
  • PHP最全编码规约

    1.1 标签 (1)【强制】PHP 程序可以使用或来界定 PHP 代码,在 HTML 页面中嵌入纯变量时,可以使用这样的形式,不可使用其他的标签变种。 正例: (2)【强制】纯 P…

    数据库 2023年6月14日
    0113
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球