mysql索引深度学习

news2024/11/26 13:31:45

索引是什么?

索引是一种用于加快查询和索引的数据结构,其本质上就是一种排序好的数据结构,就类似书的目录。

索引的底层有多种实现的结构:b树,b+树,Hash,红黑树。InnoDB和MyISAM的索引都是通过b+树实现的。

索引的优缺点

优点

1.使用所以可以大大提高检索的速度(大大减少检索的数据量),这就是创建索引的主要原因。

2.我们可以创建唯一性索引,可以实现保证每行数据的唯一性。

缺点

1.创建和维护索引需要大量的时间,当对表中的数据进行增删改时如果存在索引,则也需要对索引进行修改,这会降低SQL语句的速率。

2.索引也需要物理储存,会消耗一定量的空间内存。

索引底层数据结构的选型

Hash表

使用键值对的方式储存数据,通过hash函数(通过对地址进行取模操作)计算数据储存的索引,通过索引确定位置并储存数据。

hash表存在hash值冲突的问题:两个不相同的数据可能存在相同的hash值。

为了解决这个问题,我们使用拉链法,将hash值相同的数据,在其对应的位置使用链表进行储存。

从而解决hash冲突的问题。

但是innodb没有采用hash表,因为hash表不支持顺序和范围查询,并且每次IO只能返回一个数据 

SELECT * FROM table WHERE id < 500;

如果此时索引使用的hash表的结构,那么它需要将1~499的数据使用hash函数定位出来,效率十分低下。

二叉搜索树

特点:每个节点都符合:左边节点的值都小于当前节点,右边节点的值都大于当前节点。

在理想条件下,节点的左子树的深度和右子树的深度差不会超过一层,此时的时间复杂度为O(logN),而当插入的数据为递增或递减的情况时(斜树),结构就会变成链表的结构,此时的时间复杂度为O(N),效率就大大降低。

但是innodb没有采用二叉搜索树,因为二叉搜索树极度依赖其平衡性,太不稳定了。

AVL(平衡二叉搜索树)

其结构就是一直保持左右子树的高度差为1以内的二叉搜索树。为了解 决二叉搜索树变为链表的情况。

主要通过四种旋转操作控制二叉树的平衡,LL,RR,LR,RL。

在数据的储存上需要频繁依赖旋转操作来保持平衡,需要巨大的计算开销从而影响性能,因为在每个节点上只能储存一个数据,而每次进行IO操作时只能获取一个数据,如果需要查询的数据存在于多个节点上,我们就要多次使用IO操作,非常的耗时(IO操作是非常耗时的),所以innoDB没有使用AVL作为数据结构。 

红黑树

红黑树的特点:

1.节点只能为黑色或红色。

2.叶子节点为黑色。

3.根节点到各个叶子节点的黑色节点的个数是相同的。

4.根节点为黑色。

5.节点为红色,则其父节点为黑色,子节点为黑色。

红黑树的是出现就是为了解决AVL频繁旋转的问题。 

因为红黑树的平衡较弱,其要求就是左右子树的高度在两倍以下,可能会导致树的高度较高,查找次数增多,可能导致一些数据需要多次IO操作才能得到,效率会变的低下,所以innoDB没有使用改数据结构。

B树和B+树(多路平衡查找树)

为了解决红黑树的高度高导致的查询速度慢的问题,我们就使用B树和B+树,它们就是多叉搜索树

B树的特点: 在数据量相同的情况下,平衡二叉查找树的高度要大于B树的高度。

B树的结构

 

B+树的结构

B树和B+树的区别

1.B树的子树数量等于关键字的数量 + 1,2.B树的叶子节点是独立的,而B+树的叶子节点则是使用双向链表进行关联的。

3.B树的所有节点都可以存放key和data,而B+树只有在叶子节点才能存放key和data。
 

InnoDB和MyISAM的索引为什么都是使用B+树实现的呢?

储存相同数据的时候,AVL树的高度比B树要高,所以器其对应的IO的操作次数也更多,为了减少IO的操作次数,我们使用B+树实现索引。

主索引(primary key)

主索引也叫主键。 

在mysql的InnoDB中,如果在表中没有设置主键,InnoDB会自动检查表中是否有唯一索引且没有null值的字段,如果有的话,就会将该字段设置为主索引,如果没有找到自动创建一个6Byte的自增主键。

二级索引

通过二级索引,我们可以确定主键的位置,因为二级索引的叶子节点储存的数据就是主键。

二级索引有: 唯一索引,普通索引,前缀索引,全文索引。

二级索引的种类和作用 

唯一索引: 唯一索引是一种约束,其的作用就是唯一索引的属性列中的数据不能重复,但是其可以为null,用于实现数据的唯一性,在一张表中可以设置到多个唯一索引。

普通索引:用于加快数据的查询速度,在一张表中可以设置多个普通索引。

前缀索引:适用于字符串类型的数据,就是去字符串前缀几个字符作为索引,比普通索引建立的数据更小。

全文索引:全文索引主要是为了检索大文件数据中的关键字的信息。

聚簇索引(聚集索引)

索引的结构和数据一起存放的索引,并不是一种单独的索引类型,InnoDB的主键就是使用聚簇索引。

聚簇索引的优缺点

优点

1.查询速度非常快:因为整个结构就是B+树,所以查询速度非常快,相比于非聚簇索引,聚簇索引少一次IO操作。

2.对排序查找和范围查找优化。

缺点

1.依赖于有序的数据:因为B+树的原因,如果数据无序的情况,在数据插入的时候需要进行排序,效率就很低。

2.更新代价大:因为结构和数据存放在一起,所以在修改的时候更新代价大。

非聚簇索引(非聚索引)

索引的结构和数据不是存放在一起的索引,并不是一种单独的索引类型,二级索引就是非簇索引,MyISAM的主键和非主键都是使用非聚簇索引。

非聚簇的优缺点

优点:更新代价比聚簇索引小。

缺点

1.依赖于有序的数据,其结构是B+树。

2.可能需要二次查询(回表):这是非聚簇索引的最大缺点,当查询到对应的指针或主键后,还需要根据指针或主键再到文件或表中查询。

 

非簇索引一定会进行回表吗?

不一定,当一个索引包含(覆盖)了需要查询字段的所有值的时候,就不需要进行回表操作了。

 SELECT name FROM table WHERE name='guang19';

此时如果字段name正好建立了索引,此时索引包含了所有需要查询的字段,并且不会进行回表操作。

总的来说,如果一个索引包含了所有需要查询的字段的时候(也就是覆盖索引),就不需要回表操作。

 

覆盖索引和联合索引 

 覆盖索引

覆盖索引:查询的所有字段正好是索引的字段,那么直接根据索引查询出数据,无需进行回表操作。

联合索引

联合索引:使用表中多个字段创建索引,该索引就叫作联合索引或组合索引或复合索引。

 

索引下推

索引下推是mysql5.6之后提供的一项索引优化功能,可以在非聚簇索引遍历过程中,对索引包含的字段先进行判断,过滤不符合条件的记录,减少回表的次数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1170633.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【安全】Java幂等性校验解决重复点击(6种实现方式)

目录 一、简介1.1 什么是幂等&#xff1f;1.2 为什么需要幂等性&#xff1f;1.3 接口超时&#xff0c;应该如何处理&#xff1f;1.4 幂等性对系统的影响 二、Restful API 接口的幂等性三、实现方式3.1 数据库层面&#xff0c;主键/唯一索引冲突3.2 数据库层面&#xff0c;乐观锁…

Flink SQL 窗口聚合详解

1.滚动窗⼝&#xff08;TUMBLE&#xff09; **滚动窗⼝定义&#xff1a;**滚动窗⼝将每个元素指定给指定窗⼝⼤⼩的窗⼝&#xff0c;滚动窗⼝具有固定⼤⼩&#xff0c;且不重叠。 例如&#xff0c;指定⼀个⼤⼩为 5 分钟的滚动窗⼝&#xff0c;Flink 将每隔 5 分钟开启⼀个新…

Activiti7工作原理

Java Activiti是一个开源的工作流引擎&#xff0c;用于管理和执行业务流程。 它是基于BPMN 2.0标准的&#xff0c;提供了丰富的功能和灵活性。 Java Activiti的工作原理如下&#xff1a; 1.Java Activiti 流程建模 使用BPMN 2.0标准的图形化编辑器&#xff0c;可以创建和定义…

基于饥饿游戏算法的无人机航迹规划-附代码

基于饥饿游戏算法的无人机航迹规划 文章目录 基于饥饿游戏算法的无人机航迹规划1.饥饿游戏搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用饥饿游戏算法来优化无人机航迹规划。 …

Docker容器技术实战3

8、docker原生网络 Docker原生网络基于Linux桥接技术和虚拟网络接口&#xff0c;使用了Linux内核的网络功能。每个Docker容器都有自己的网络命名空间&#xff0c;这使得容器之间可以使用独立的IP地址&#xff0c;并隔离了容器的网络栈。 当创建一个Docker原生网络时&#xff…

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題

Apache Flink 1.12.0 on Yarn(3.1.1) 所遇到的問題 新搭建的FLINK集群出现的问题汇总 1.新搭建的Flink集群和Hadoop集群无法正常启动Flink任务 查看这个提交任务的日志无法发现有用的错误信息。 进一步查看yarn日志&#xff1a; 发现只有JobManager的错误日志出现了如下的…

JOSEF约瑟 数显三相电压继电器 HJY-931A/D 导轨安装

名称&#xff1a;数字交流三相电压继电器型号&#xff1a;HJY-93系列品牌&#xff1a;JOSEF约瑟电压整定范围&#xff1a;10~450VAC额定电压&#xff1a;200、400VAC功率消耗&#xff1a;≤5W HJY系列 数字交流三相电压继电器 系列型号 HJY-931A/D数字式交流三相电压继电器&am…

吴恩达《机器学习》5-6:向量化

在深度学习和数值计算中&#xff0c;效率和性能是至关重要的。一个有效的方法是使用向量化技术&#xff0c;它可以显著提高计算速度&#xff0c;减少代码的复杂性。接下来将介绍向量化的概念以及如何在不同编程语言和工具中应用它&#xff0c;包括 Octave、MATLAB、Python、Num…

lvgl生成图片

网址&#xff1a;https://lvgl.io/tools/imageconverter CF_TRUE_COLOR:可以生成565&#xff0c;232&#xff0c;等多种形式的数组&#xff0c;选择Carray,会生成C数组。

2023.11.2事件纪念

然而造化又常常为庸人设计,以时间的流逝,来洗涤旧迹,仅以留下淡红的血色和微漠的悲哀。 回顾这次事件&#xff0c;最深的感触就是什么是团队的力量&#xff01; 当我们看到希望快要成功的时候&#xff0c;大家洋溢出兴奋开心的表情&#xff0c;一起的欢声笑语&#xff1b;但看…

抖音群控软件的作用是什么?

随着智能手机的普及和社交媒体的兴起&#xff0c;抖音成为了人们日常生活中不可或缺的一部分&#xff0c;许多人都通过抖音平台分享自己的生活、展示才艺、开展商业活动等。 然而&#xff0c;要想在抖音上获得更多的关注和收益&#xff0c;需要投入大量的时间和精力&#xff0…

【C语言初学者周冲刺计划】3.2将一个数组中的值逆序重新存放

目录 1解题思路&#xff1a; 2代码 3运行代码如图&#xff1a; 4总结&#xff1a; 1解题思路&#xff1a; 首先学会如何利用循环输入位数和输入数值&#xff0c;然后再利用循环逆序即可 2代码 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int…

佳易王钟表铭表维修养护拍图留存查询手表保养跟踪记录系统软件下载

佳易王钟表铭表维修养护拍图留存查询手表保养跟踪记录系统软件下载 【软件试用版下载、软件资讯或技术支持服务可以点击文章最下方官网】 佳易王钟表养护维修管理系统V16.3&#xff0c;录入维修订单&#xff0c;维修进度查询&#xff0c;会员活动方案&#xff0c;打印服务报…

并发安全问题之--锁失效和锁边界问题

并发安全问题之–锁失效和锁边界问题 此处为新增insert无法在SQL中通过数量限制(除非插入SQL中有子查询)&#xff0c;上面改进的乐观锁失效&#xff08;前一节的乐观锁适合修改数据&#xff09; 故使用悲观锁&#xff0c;synchronized如果加在方法上范围是this是整个service&…

OSG多视口创建:osgViewer::CompositeViewer

1、效果 在osg的实际应用场景中&#xff0c;有时候需要同时创建多个场景视图&#xff0c;并保证各个场景视图中有不一样的显示和操作&#xff1a;例如&#xff1a;漫游器、照相机、粒子效果、多个模型组合等。此时就要用到OSG提供的osgViewer::CompositeViewer类来实现这个需求…

音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法

一、介绍 音乐推荐与管理系统。本系统采用Python作为主要开发语言&#xff0c;前端使用HTML、CSS、BootStrap等技术搭建界面平台&#xff0c;后端使用Django框架处理请求&#xff0c;并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协…

Jmeter和Postman哪个做接口测试会更好

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法

gcc -static 在centos stream8 和centos stream9中运行报错的解决办法&#xff1a; 报/usr/bin/ld: cannot find -lc 我们下载glibc-static&#xff1a; 选择x86_64的。 还有一个是libxcrypt-static&#xff0c;依旧在这个网站里搜。 rpm -ivh glibc-static-2.28-239.el8.x…

项目实战之理解代码一(vue.config.js)

文章目录 CDN 面经天天背&#xff0c;今天总算见到真的了。 OK&#xff0c;接下来让我们走进前端优化性能方式之一&#xff1a;CDN CDN CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是用于存储和传输静态资源&#xff08;如 JavaScript、CSS…

如何为一个Type类赋值

如何为一个Type类赋值 前言案例准备一、简单赋值 前言 今天我在写代码的时候遇到一个神奇的类——Type,虽然说我们都心知肚明这个类代表着什么&#xff08;字面意思嘛&#xff0c;很好理解&#xff09;&#xff0c;但是实操起来却无从下手&#xff0c;就如何对Type类进行赋值&…