mysql中的各种索引大总结

article/2025/10/9 17:51:54

文章目录

    • 为啥不用二叉搜索树?
    • 为啥不用平衡二叉(avl)树?
    • 为啥不用b-树?
    • 为啥用b+树?(重点)
    • 索引
    • 聚簇索引
    • 聚簇索引的局限
    • 聚集的数据的优点
    • 非聚簇索引介绍
    • 组合索引
    • 覆盖索引
    • 前缀索引
    • 前缀索引选择算法
    • 全文索引
    • hash索引
    • b-tree索引
    • 自适应哈希索引

b-tree索引使用的是b+树的数据结构,树有这么多种,那为啥就选择b+树呢?那就从为啥使用b+树开始,到分析其原理的思路一步步分析吧。以下内容针对innodb来说

为啥不用二叉搜索树?

定义:
1:非空左子树的所有键值小于其根结点的键值。
2:非空右子树的所有键值大于其根结点的键值。
3:左、右子树都是二叉搜索树。就是左节点<根节点<右节点。
看下图树太高了。查询效率太低,故不推荐。
在这里插入图片描述

为啥不用平衡二叉(avl)树?

定义
1.非叶子节点最多拥有两个子节点。
2.非叶子节值大于左边子节点、小于右边子节点。
3.树的左右两边的层级数相差不会大于1。
4.没有值相等重复的节点。

虽然avl树对于二叉树来说是平衡了降低了树的高度,虽然提高了性能,但是数据量大一点的时候,高度依旧很高。毕竟定义一摆在那,非叶子节点怎么找最多也只能有俩个子节点,故不推荐。

为啥不用b-树?

定义:
1.在一个节点中,存放着数据(包括key和data)以及指针,且相互间隔。
2.同一个节点,key增序。
3.一个节点最左边的指针不为空,则它指定的节点左右的key小于最左边的key。右边同理。中间的指针指向的节点的key位于相邻两个key的中间。
4.B-Tree中不同节点存放的key和指针可能数量不一致,但是每个节点的域和上限是一致的,所以在实现中B-Tree往往对每个节点申请同等大小的空间。
5.每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。

简单点来说呢,b-树又称多路查找树相对于avl树来说就是每个节点下面可以有多个分叉。至少多于2个叉撒,对于百万级别的数据又是降低了树的高度,虽然提高了性能,但是由于每个索引节点都有存放 data域的指针,而我们计算机每次从磁盘读取数据时以页(4kb)为单位,每次读取4096byte的数据,导致读取单个节点时,可能由于节点过大,每次读出的数据有限,从而增大io次数,故在mysql这种关系型数据库中不推荐。但是b-树还是有它自己的优点的,如果查找的节点,离根节点很近那么查找的效率还是很高的

为啥用b+树?(重点)

定义:
1.内节点不存储data,只存储key和指针;叶子节点不存储指针,存key和data。
2.内节点和叶子节点大小不同。
3.每个节点的指针上限为2d而不是2d+1

b+树相对与b-树来说好的地方就是
1:数据只在叶子节点上面才有。解决了b-树非叶子节点过大导致io次数过多的问题。
2:树高更低同时由于非叶子节点不放数据,单个节点能存的关键字更多了,极大的降低了树的层级高度。
3:可以范围查找由于叶子节点之间是有一个有序链表来维护的,进行范围查找十分方便,单向的还是双向的不清楚,先搁着下面测试在来看。
4:全节点遍历更快b+树只需扫描叶子节点,而不是像b-树那样逐层扫描每个节点
5:查询速度更稳定如果是b-树,查离根节点近的速度就快,远的就慢,而b+树数据全在叶子节点,每次查找的速度都相同
到此为啥使用b+树就有底了。那么开始正文。。。。。

索引

定义:一种数据结构
按照范围从大到小来说吧,最大的是聚簇索引、非聚簇索引。接着是我们常说的b-tree索引、hash索引,而我们的覆盖索引、前缀索引、组合索引、复合索引、全文索引是基于b-tree、hash索引来说的,还有的就是Innodb引擎独有的自适应哈希索引下面一一展开了来说。

聚簇索引

定义:是一种存储数据的方式,数据与索引在一个文件中。它的辅助索引的叶子节点存储的是指向行的指针。
一般来说innodb是按照主键来进行聚集的,这就意味着被索引的列就是主键列。如果主键不存在,其次就是按照非空唯一性约束来进行聚集,如果这个约束都没得,其次就是按照Innodb它自己生成的一个隐藏主键列来聚集。那么使用聚簇索引有什么优缺点吗?当然是有的。

聚簇索引的局限

如果我们往聚簇索引中插入非顺序的数据时的情况下面
1:由于新行的主键不一定比前一个大,Innodb不能总是把数据插入到最后一行,因此需要为新行进行寻找位置,从而进行多次随机的io
2:更新数据时innodb有时不得不进行分页,为新行开辟内存空间,这会导致移动大量的数据
3:页面会因为分页变得稀疏不规则从而就会导致一些不规则的碎片产生
4:在没有覆盖索引的情况下,查辅助索引的时候,经常需要回表
而且如果我们按照主键顺序插入行的情况下,使用uuid來聚集也是不好的。也会产生写,到磁盘上的数据被重新读取出来,并且由于位置的不确定,也会导致大量的数据移动

聚集的数据的优点

1:聚集索引把数据和索引全部放到一个b-tree下面,从聚集索引中取得数据通常比非聚集索引取得的数据更快,因为不需要二次查找。
2:对于范围查询的效率很高,因为数据是有序的

非聚簇索引介绍

非聚簇索引是什么呢?其实我们所说的辅助索引、第二索引啊啥的其实可以理解为就是非聚簇索引。非聚簇索引就是叶子节点的data域中存的不是完整的数据,而是指向磁盘数据的指针。

组合索引

定义:单列索引的组合。我感觉和覆盖索引没啥差别,假设现在有一张表(test)有a,b,c,d,e这么几个字段,其中我们为a,b,c列添加一个索引叫a_b_c,这个就是组合索引。

覆盖索引

定义:索引列已经包含了我们需要查询的数据。其实就是组合索引(复合索引)在特定情况下的又一别称。假设现在有一张表(test)有a,b,c,d,e这么几个字段,其中我们为a,b,c列添加一个索引叫a_b_c,现在select a,b,c from test where a = x1 and b = x2 and c = x3;我们需要查询的数据在辅助索引上面已经有了,此时使用的就是复合索引。

前缀索引

定义:为数据的前面几个字段创建的索引。我个人理解其实就是单列索引的变种。那为什么要为前几个字符创建索引而不是为其全部来创建索引呢?原因也是很简单,这个得结合应用场景来说了。现在有这么一张表,专门是存储家庭地址的,一个地址动不动就是十来个字的长度,如果我们以全部长度来创建索引,那么这个索引文件是超级的大啊。此时创建前缀索引是个不错的选择,可以大幅度压缩索引的大小,那么我们该如何确定前缀索引的长度的呢?这就是涉及到一个算法了。

前缀索引选择算法

不重复的索引值/所有行 = 比值,这个比值接近7的时候,所得到的结果就会越加精确。

全文索引

参考
https://blog.csdn.net/Samdy_Chan/article/details/78138420?utm_medium=distribute.pc_relevant.none-task-blog-blogcommendfrommachinelearnpai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-blogcommendfrommachinelearnpai2-1.edu_weight

hash索引

使用的场景:一些读操作密集的表建议使用hash索引,因为hash索引的查找速度是很快的。但是也有一些局限。
hash索引的局限性:
1:hash索引只包含哈希码和行指针,不能使用索引的值避免读取行,也就是要回表,不能像覆盖索引那样避免回表。
2:hash索引不能进行排序以及范围查找,因为它们不会按照顺序保存行。
3:有可能产生hash碰撞,那么就必须要访问链表的每一个行指针,然后逐行进行比较得出正确数据。
4:只支持 = 、in 、<=>的比较,为啥呢原因很简单,不会按照顺序存行。
5:不支持部分键匹配,例如有个组合索引a_b,那么此时即使我们的where子句中使用到了a,也不会使用索引。

b-tree索引

底层数据结构b+tree,对比hash的局限来看,hash索引的局限在b-tree索引这都不是事,除了hash索引查询速度快这点上面

自适应哈希索引

与其说这是一种索引不如称其为是一种机制。自适应哈希索引的由来就是:当Innodb注意到一些索引值被频繁的访问时,内部会在b-tree索引的顶端为其创建索引保存在内存之中,使其具有快速哈希查找的特性,这个过程是它自动完成的,


http://chatgpt.dhexx.cn/article/qmBfdEtn.shtml

相关文章

MySQL索引的更新策略

对于数据的每一次更新&#xff0c;MySQL并不会每次都会更新索引(针对非唯一性索引而言)&#xff0c;索引的更新策略是这样的&#xff1a; 在InnoDB中&#xff0c;增删改都会立刻修改主键or唯一索引&#xff0c;但是不会rebuild全局索引&#xff0c;而是对这些索引增加值(或移除…

苹果各机型尺寸大小

//6.5英寸 #define iPhoneXSMax ([UIScreen instancesRespondToSelector:selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1242, 2688), [[UIScreen mainScreen] currentMode].size) : NO) //6.1英寸 #define iPhoneXR ([UIScreen instancesRespondToSelector:selec…

iOS 手机尺寸

iPhone设备 物理分辨率是硬件所支持的&#xff0c;逻辑分辨率是软件可以达到的。 代数设备操作系统逻辑分辨率(point)物理分辨率(pixel)屏幕尺寸(对角线长度)缩放因子 iPhone 第一代iPhone 2GiOS 1320 x 480480 x 3203.5寸1x第二代iPhone 3iOS 2320 x 480480 x 3203.5寸1…

jQuery weui 时间选择器datetimepicker年月日最简单解决方案

使用jqweui的时候发现&#xff0c;datetimePicker&#xff08;时间日期选择器&#xff09;竟然不提供只有年月日这种模式&#xff0c;真是牛逼&#xff08;垃圾&#xff09;&#xff0c;跟着我&#xff0c;只需要很简单的修改就好了&#xff0c;上图 下面是js $("#datati…

jquery weui 显示loading

jQuery weui 显示loading按钮官方文档并没有给出demo&#xff0c;经过调试&#xff0c;把代码给拷贝了出来。 实现显示loading的代码如下&#xff1a; <div id"loadDiv" style"display: none;" class"weui-toast weui_loading_toast weui-toast--…

$ppclass php,jquery weui

"weui-tab"!----"weui-"!--二级页积分详情--"""weui--itemweui-tab__bd-item--active"divclass"details"divclass"page-header"?Html::img($this-theme-getAssetUrl(images/logo.png),[classlogo])?/divahref&q…

移动端框架之JQuery WeUI

和JQuery WeUI 配合使用的WeUI&#xff0c;是移动端快速开发的利器。 在初步使用的过程中&#xff0c;发现JQuery WeUI扩展的几个功能特别实用&#xff1a; 1.通知&#xff1a;模仿iOS风格的通知。你可以自定义标题&#xff0c;文案和图标。通过滑动手势可以关闭。 这种通知形…

基于Jquery WeUI的微信开发H5页面控件的经验总结(2)

在微信开发H5页面的时候&#xff0c;往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发&#xff0c;由于本人喜欢在Asp.net的Web界面上使用JQuery&#xff0c;因此比较倾向于使用 jQuery WeUI&#xff0c;本篇随笔结合官方案例和自己的项目实际开发过程的经验总结&…

jquery weui 图片浏览器Photo Browser 如何使用?

对应组件地址&#xff1a;http://jqweui.com/extends#swiper 先说说业务场景&#xff1a;类似朋友圈这样的布局效果&#xff0c;点击小图可以浏览大图&#xff0c;并支持大图左右切换&#xff0c;效果图如下&#xff08;加了滚动加载更多的操作在里面&#xff09;&#xff1a;…

jQuery WeUI日历calendar时间段(开始日期默认选中日期是今天,结束日期设置最小日期),显示日期格式是yyyy年mm月dd日

jQuery WeUI官网&#xff1a; https://jqweui.cn(国内) 说明 日历calendar时间段为两段&#xff0c;开始日期和结束日期。 开始日期&#xff1a;打开后&#xff0c;默认选中日期是今天。 结束日期&#xff1a;打开后&#xff0c;默认选中和最小日期是开始日期。 html <d…

【WeUI】关于jQuery WeUI和WeUI版本兼容的问题

最近做的一个小demo&#xff0c;在添加Dialog的时候出现了对话框显示的问题&#xff0c;如下左图所示。 一开始以为自己的写的CSS文件影响了&#xff0c;注释掉还是这个问题&#xff0c;所以问题指向很明确了&#xff0c;是官方weui.css的问题。但是官方demo里的运行是正常显示…

jQueryWEUI自定义对话框-带有textarea

jQueryWEUI 示例下载 在jQueryWEUI中提供了很多类型的对话框&#xff0c; 可以去访问看一下。 今天记录的则是&#xff0c;自己定义的一个带有文本域的对话框&#xff0c;这样&#xff0c;可以不通过调转页面&#xff0c;实现一些信息的提交。比如&#xff0c;发送留言&#x…

jQuery weui 时间选择器datetimepicker只用年月日

<input placeholder"请选择出生日期" name"birth_time" type"text" iddatetime-picker />let allTime ;var myDate new Date();//let CreateDateLessD myDate.getFullYear() "-" (myDate.getMonth() 1) "-" …

关于Jqueryweui 的select联动用法

在使用Jquery weui 框架时&#xff0c;我想实现根据收货地址获得该条收货地址的绑定的联系人和电话。 但是又懒得根据收货地址查询联系人和联系电话。&#xff08;因为收货地址都是从数据库获取的&#xff0c;此时不仅拿到了收货地址&#xff0c;还拿到了联系人和联系电话&…

jQuery WeUI 上传

jQuery WeUI 是专为微信公众账号开发而设计的一个框架&#xff0c;jQuery WeUI的官网&#xff1a;http://jqweui.com/ 需求&#xff1a;需要在微信公众号网页添加上传图片功能 技术选型&#xff1a;实现上传图片功能可选百度的WebUploader、饿了么的Element和微信的jQuery We…

jQuery WEUI select的使用

jQuery WEUI select的使用 1.官网样式&#xff1a; html样式 <div class"weui-cell"><div class"weui-cell__hd"><label class"weui-label">联系人</label></div><div class"weui-cell__bd">&l…

前端优秀框架jQuery weui推荐

作为和微信风格类似的一款移动端开发工具 jQuery weu在移动端开发中也是能完美兼容微信&#xff0c;而且语法简单对前端萌新开发移动端H5页面相对友好 这边推荐的资源网站是 http://www.santii.com/weui 这这里你可以看到很完整的组件使用 但这个框架的依赖相对比较难找 可能需…

浅谈jQuery WeUI框架

WeUI 是一套同微信原生视觉体验一致的基础样式库&#xff0c;由微信官方设计团队为微信内网页和微信小程序量身设计。而jQuery WeUI是在其基础上的加强版本&#xff0c;专为微信公众账号开发而设计的一个简洁而强大的UI库&#xff0c;包含全部WeUI官方的CSS组件&#xff0c;并且…

jQuery WeUI学习笔记一

一 引言 最近在对时间典当行这一公众号进行一个粗浅的学习。涉及到WeUI插件库&#xff0c;就整理以下笔记。 &#xff11; jQuery WeUI官网地址&#xff1a;http://jqweui.com/ &#xff12; WeUI 目前只包含 CSS 代码&#xff0c;核心文件是weui.css jQuery WeUI WeUI …

Jquery WeUI(一)

用于微信端的控件UI &#xff0c; 首先&#xff0c;需要做的是开发一个微信能访问的网页&#xff0c;并和微信关联 A&#xff0e; 创建一个空网站 B&#xff0e; 增加一般处理程序 A&#xff0e; 增加 web 网页 和空文件到项目中 B&#xff0e; 申请和配置测试服务 创建菜单 通…