mysql索引深度学习

索引是什么?

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

索引的底层有多种实现的结构: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.mzph.cn/news/130630.shtml

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

相关文章

Python模块psutil:系统进程管理与Selenium效率提升的完美结合

前言 在前面编写一个Selenium的自动化程序时候&#xff0c;发现一个问题。 因笔记本配置较为差&#xff0c;所以每次初始化Selenium的WebDriver都会非常慢&#xff0c;整个等待过程是不友好的。 所以我就想到&#xff1a; 在程序中初始化一个全局的WebDriver对象&#xff0c…

算法——多数相和

三数 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 所以代码实现应该是 vector<vector<int>> threeSum(vector<int>& nums) {int n nums.size();sort(nums.begin(), nums.end()); // 对数组进行排序&#xff0c;以便后续操作vector<vector…

快速了解推荐引擎检索技术

目录 一、推荐引擎和其检索技术 二、推荐引擎的整体架构和工作过程 &#xff08;一&#xff09;用户画像 &#xff08;二&#xff09;文章画像 &#xff08;三&#xff09;推荐算法召回 三、基于内容的召回 &#xff08;一&#xff09;召回算法 &#xff08;二&#xf…

C#高级--IO详解

零、文章目录 IO详解 1、IO是什么 &#xff08;1&#xff09;IO是什么 IO是输入/输出的缩写&#xff0c;即Input/Output。在计算机领域&#xff0c;IO通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。输入和输出是信息处理系统&#xff08;例如计算器&…

分享者 - 携程旅游创作者搬砖项目图文教程

大家好&#xff01;携程这个出行旅游平台相信大家都不陌生吧。 每天都有大量的旅客在里面浏览攻略&#xff0c;寻找灵感和旅游建议。 那么&#xff0c;我们的项目就是把一些优质的小红书平台上的旅游攻略或作品&#xff0c;经过处理后搬运到携程平台上发布。 这个项目如何操作呢…

Portraiture4.1.2最新中文汉化版

提起PS后期修图人像美白磨皮&#xff0c;大家会想到各种磨皮工具&#xff0c;其中Portraiture这款磨皮效率超高&#xff0c;是99%摄影师的必备插件&#xff0c;一秒磨皮&#xff0c;无卡顿&#xff0c;效果好&#xff01;人像摄影师人均一款&#xff0c;磨皮质感非常好&#xf…

独创改进 | RT-DETR 引入双向级联特征融合结构 RepBi-PAN | 附手绘结构图原图

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 文章目录 YOLOv6贡献RepBi-…

实习记录--(海量数据如何判重?)--每天都要保持学习状态和专注的状态啊!!!---你的未来值得你去奋斗

海量数据如何判重&#xff1f; 判断一个值是否存在&#xff1f;解决方法&#xff1a; 1.使用哈希表&#xff1a; 可以将数据进行哈希操作&#xff0c;将数据存储在相应的桶中。 查询时&#xff0c;根据哈希值定位到对应的桶&#xff0c;然后在桶内进行查找。这种方法的时间复…

一站式解决方案:体验亚马逊轻量服务器/VPS的顶级服务与灵活性

文章目录 一、什么是轻量级服务器/VPS 二、服务器创建步骤 三、服务器连接客户端(私钥登录) 四、使用服务器搭建博客网站 五、个人浅解及总结 一、什么是轻量级服务器/VPS 亚马逊推出的轻量级服务器/VPS&#xff1a;是一种基于云计算技术的虚拟服务器解决方案。它允许用户…

0005Java安卓程序设计-ssm基于Android的网店系统

文章目录 **摘要**目录系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。网上管…

Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)

目录 前言初始化数据库Docker 部署 xxl-job下载镜像创建容器并运行访问调度中心 SpringBoot 整合 xxl-jobpom.xmlapplication.ymlXxlJobConfig.java执行器注册查看 定时任务测试添加测试任务配置定时任务测试结果 结语附录xxl-job 官方文档xxl-job 源码测试项目源码 前言 xxl-…

代码随想录算法训练营第四十三天丨 动态规划part06

518.零钱兑换II 思路 这是一道典型的背包问题&#xff0c;一看到钱币数量不限&#xff0c;就知道这是一个完全背包。 对完全背包还不了解的同学&#xff0c;可以看这篇&#xff1a;动态规划&#xff1a;关于完全背包&#xff0c;你该了解这些&#xff01;(opens new window)…

Java基础篇 | 多线程详解

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

RMI初探

接口 import java.rmi.Remote; import java.rmi.RemoteException;public interface IFoo extends Remote {String say(String name) throws RemoteException; }import java.rmi.Remote; import java.rmi.RemoteException;public interface IBar extends Remote {String buy(Str…

【Nginx38】Nginx学习:SSL模块(二)错误状态码、变量及宝塔配置分析

Nginx学习&#xff1a;SSL模块&#xff08;二&#xff09;错误状态码、变量及宝塔配置分析 继续我们的 SSL 模块的学习。上回其实我们已经搭建起了一个 HTTPS 服务器了&#xff0c;只用了三个配置&#xff0c;其中一个是 listen 的参数&#xff0c;另外两个是指定密钥文件的地址…

overleaf里插入中文语句

作业要求是需要插入中文 我直接插入中文生成pdf会报错&#xff1a; 解决办法&#xff1a; overleaf官网里提供了教程&#xff1a;https://www.overleaf.com/learn/latex/Chinese 使用XeLaTeX或者LuaLaTeX进行编译是支持UTF-8编码。所以改变编译器的步骤如下&#xff1a; 点击…

版本控制系统-SVN

SVN Apache Subversion 通常被缩写成 SVN&#xff0c;是一个开放源代码的版本控制系统。 官网&#xff1a;https://subversion.apache.org 资料&#xff1a;https://svnbook.red-bean.com、https://www.runoob.com/svn/svn-tutorial.html 下载&#xff1a;https://sourceforg…

向量数据库的崛起与多元化场景创新

向量数据库的崛起与多元化场景创新 前言&#xff1a; 在当今数字化时代&#xff0c;数据被认为是黄金&#xff0c;对于企业、科学家和决策者而言都具有巨大的价值。然而&#xff0c;随着数据规模的不断增长&#xff0c;有效地管理、存储和检索数据变得愈发复杂。这就引入了向量…

【实验记录】为了混毕业·读读论文叭

PR曲线 1. Robust_Place_Recognition_using_an_Imaging_Lidar 在第三节方法中&#xff0c;提到了一些列处理步骤&#xff0c;分析来与vins相似&#xff0c;在vins中是关键帧检索、特征提取、DBoW查询、描述子匹配、PnP RANSAC求解。 第四节的实验部分&#xff0c;没有绘制pr…

旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用

引言&#xff1a; VR全景技术的引入为旅游业带来了一场变革。这项先进技术不仅提供了前所未有的互动体验&#xff0c;还为景区旅游文化注入了新的生机。 一&#xff0e;VR全景技术&#xff1a;革新旅游体验 1.什么是VR全景技术&#xff1f; VR全景技术是一种虚拟现实技术&am…