Mysql索引结构全维度比较

本文为博客 VIP 文章,开通 VIP 后可阅读全文

开通 VIP

前言

在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引)。本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B+树作为索引结构。

一、二叉查找树(BST):不平衡

二叉查找树(BST,Binary Search Tree),也叫二叉排序树,在二叉树的基础上需要满足:任意节点的左子树上所有节点值不大于根节点的值,任意节点的右子树上所有节点值不小于根节点的值。如下是一颗BST(图片来源)。

Mysql索引,怎么都开始使用这个结构?
当需要快速查找时,将数据存储在BST是一种常见的选择,因为此时查询时间取决于树高,平均时间复杂度是O(lgn)。然而,BST可能长歪而变得不平衡,如下图所示(图片来源),此时BST退化为链表,时间复杂度退化为O(n)。

为了解决这个问题,引入了平衡二叉树。

Mysql索引,怎么都开始使用这个结构?

二、平衡二叉树(AVL):旋转耗时

AVL树是严格的平衡二叉树,所有节点的左右子树高度差不能超过1;AVL树查找、插入和删除在平均和最坏情况下都是O(lgn)。

AVL实现平衡的关键在于旋转操作:插入和删除可能破坏二叉树的平衡,此时需要通过一次或多次树旋转来重新平衡这个树。当插入数据时,最多只需要1次旋转(单旋转或双旋转);但是当删除数据时,会导致树失衡,AVL需要维护从被删除节点到根节点这条路径上所有节点的平衡,旋转的量级为O(lgn)。

由于旋转的耗时,AVL树在删除数据时效率很低;在删除操作较多时,维护平衡所需的代价可能高于其带来的好处,因此AVL实际使用并不广泛。

三、红黑树:树太高

与AVL树相比,红黑树并不追求严格的平衡,而是大致的平衡:只是确保从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。从实现来看,红黑树最大的特点是每个节点都属于两种颜色(红色或黑色)之一,且节点

mysql为什么要使用B+作为索引 1 概述 大家可能在面试的时候都会被问到这样一个问题:mysql索引结构是什么?这个时候了解的都知道是B+,那么为什么会采用B+作为它的索引结构呢? 由图可以知道:索引的存在时为了加快数据访问提高查询效率的,而数据存储在磁盘中,但从磁盘读取数据会产生大量的IO操作,读取效率是非常低的。所以在读取的时候要减少io量和减少io次数来提高读取效率。 ... 阅读详情

相关推荐

史上最Mysql索引教程

索引是数据库中用来提高数据检索效率的数据结构。它类似于书籍的目录,可以帮助用户快速找到所需的数据,而不必扫描整个数据集。在数据库系统中,索引可以显著提高查询性能。所谓的存储引擎,说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。MSQL存储引擎有 MyISAM、InnoDB、Memory,其中 InnoDB 是在 MySQL 5.5 之后成为默认的存储引擎。以下是简化版的mysql结构图,其中,索引和数据是存储在存储引擎中的。

qq_62325622的博客 2951

MySQL的b+

MySQL的b+

学无止境 947

解读MySQL 索引基础

我们完可以将索引可以看作是书本的目录,通过书本的目录查找对应的章节就会快一些,索引底层数据结构有b、b+、红黑、哈希表、甚至是链表等,对于MySQL而言,无论Innodb还是MyIsam最左匹配原则算是MySQL的一个重点了,它会基于联合索引最左的字段进行排序,例如我们用字段a、b、c创建联合索引,他就会先通过a进行排序,如果a一样比较b,b再一样比较c这样,通过这样的比较机制生成一个有序的索引结构

禅与计算机程序设计的艺术 3992

MySQL索引-B+(讲得通透)

索引这个词,相信大多数人已经相当熟悉了,很多人都知道MySQL索引主要以B+为主,但是要问到为什么用B+,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。索引最形象的比喻就是图书的目录了。注意这里的大量,数据量大了索引才显得有意义,如果我想要在[1,2,3,4]中找到4这个数据,直接对数据检索也很快,没有必要费力气建索引再去查找。索引mysql数据库中分三类: B+索引、Hash索引..

尽量致力于发表微服务、中间件和算法等原创作品。 1万+

MySQL索引底层:B+详解

如果插入关键字后,叶子节点当前含有的关键字数目等于阶数m,则插,该节点开始 「分裂」为两个新的节点,一个节点包含m/2 个关键字,另外一个关键字包含m/2个关键值。最后插入28,发现当前节点关键字也是不小于阶数4了,于是分裂,于是分裂, 第 4/2=2个,也就是36上移到父节点,因父子节点只有2个关键值,还是小于4的,所以不用继续分裂,插入完成。找到包含关键值的结点,如果关键字个数大于m/2-1,并且关键值是当前节点的最大(小)值,并且该关键值存在父子节点中,那么删除该关键字,同时需要相应调整父节点的值。

weixin_44837153的博客 3286

MySQL 索引原理

MySQL索引深入剖析

杨宇昌的博客 1万+

MySQL索引

MySQL索引详解

qq_64734302的博客 1943

MySQL -- 体系结构索引结构

精通MySQL是目标

qq_53839898的博客 1470

MySQL索引详解

本篇文章详细讲解了MySQL索引的知识, 包括他的原理, 优缺点, 使用, 以及的底层数据结构.

m0_73594607的博客 4502

Mysql索引类型总结

CHARVARCHARTEXTCHARVARCHARTEXT数据表的主键列使用的就是主键索引。一张数据表有只能有一个主键,并且主键不能为 null,不能重复。在 MySQL 的 InnoDB 的表中,当没有显示的指定表的主键时,InnoDB 会自动先检查表中是否有唯一索引且不允许存在 null 值的字段,如果有,则选择该字段为默认的主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。主键索引

2401_86844317的博客 1659

什么是 MySQL 索引?

什么是索引? 假设我们有一张数据表 employee(员工表),该表有三个字段(列),分别是name、age 和address。假设表employee有上万行数据(这公司还真大),现在需要从这个表中查找出所有名字是‘ZhangSan’的雇员信息,你会快速的写出SQL语句: select name,age,address from employee where name='ZhangSan...

allen的博客 5843

MySQL索引优化高频技巧:从设计到落地的维度指南

MySQL索引优化实用指南:从设计到运维解析 本文系统介绍了MySQL索引优化的核心技巧。在索引设计方面,强调优先选择高区分度字段,合理设计联合索引(遵循最左前缀原则),巧用覆盖索引避免回表,推荐使用自增主键。查询适配环节指出要避免索引字段参与函数运算、前缀通配符模糊查询、"or"连接非索引字段等常见陷阱。运维管理方面建议定期清理冗余索引,大表加索引需谨慎,控制索引数量在合理范围。文章最后总结了"索引越多越好"等常见误区,强调索引优化必须贴合业务场景,通过持续监控和

what丶k的博客 594

MySQL - 索引(B+)

B+Tree原理

qq_63353796的博客 3092

数据结构维度索引及其应用场景

数据结构维度索引及其应用场景

一起coding,一起嗨。 603

MySQL 索引解析:索引类型、聚簇索引、回表与性能优化

本文系统介绍了MySQL索引的分类与实现原理。索引按功能可分为主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、常规索引(INDEX)和索引(FULLTEXT);按存储形式分为聚簇索引和二级索引。重点分析了InnoDB引擎下聚簇索引(数据与索引一体化存储)和二级索引(存储主键值)的特点,通过图解展示了索引结构和回表查询过程,并解释了覆盖索引优化查询的原理。文章还探讨了索引设计的最佳实践,包括主键选择、索引覆盖等优化策略,为数据库性能优化提供了理论基础。

一起交流学习吧! 1207

MySQL 索引

索引是帮助MySQL高效获取数据的数据结构, 通俗点的说,数据库索引好比是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。索引是对数据库表中一列或多列的值进行排序的一种结构, 使用索引可快速访问数据库表中的特定信息能帮助mysql索引数据结构

qq_37232457的博客 1981

MySQL 索引的分类

MySQL索引分类与选型指南 MySQL索引主要分为三类:按数据结构划分(B+Tree、Hash、文、空间索引)、按物理存储划分(聚簇索引与非聚簇索引)、按逻辑功能划分(普通、唯一、主键、前缀、组合索引等)。其中B+Tree索引是最常用类型,支持范围查询和排序;Hash索引仅适合等值查询;聚簇索引决定数据物理存储顺序。组合索引需遵循最左前缀原则。 【选型建议】 优先使用B+Tree索引 精确匹配且数据量小时可选Hash索引 文本搜索用索引 空间数据用R-Tree索引 多列查询使用组合索引并注意最左前缀

csdn_tom_168的博客 733

mysql——索引

mysql相关

申俏雅的博客 1242
上一篇: 高级java人员都用过的17个jvm参数
Formor_
博客等级 码龄7年 7粉丝 31原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值