玩转Mysql 五(MySQL索引)

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除!

一、索引的数据结构

1、MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。

索引的本质:索引是数据结构。可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现高级查找算法 。

2、索引的优点
(1)类似大学图书馆建书目索引,提高数据检索的效率,降低 数据库的IO成本 ,这也是创建索            引最主要的原因。
(2)通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性 。
(3)在实现数据的参考完整性方面,可以 加速表和表之间的连接 。对于有依赖关系 的子表和              父表联合查询时,可以提高查询速度。
(4)在使用分组和排序子句进行数据查询时,可以显著 减少查询中分组和排序的时间 ,降低了           CPU的消耗。

3、索引的缺点
增加索引也有许多不利的方面,主要表现在如下几个方面:
 (1)创建索引和维护索引要耗费时间 ,并且随着数据量的增加,所耗费的时间也会增加。
 (2)索引需要占磁盘空间 ,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,存储在磁盘上 ,如果有大量的索                引,索引文件就可能比数据文件更快达到最大文件尺寸。
 (3)虽然索引大大提高了查询速度,同时却会降低更新表的速度 。当对表中的数据进行增加、删除和修改的时候,索引也要动态            地维护,这样就降低了数据的维护速度。因此,选择使用索引时,需要综合考虑索引的优点和缺点。

二、B+tree索引图

一个B+树的节点其实可以分成好多层,规定最下边的那层,也就是存放我们用户记录的那层为第 0 层,之后依次往上加。之前我们做了一个非常极端的假设:存放用户记录的页 最多存放3条记录 ,存放目录项记录的页 最多存放4条记录 。其实真实环境中一个页存放的记录数量是非常大的,假设所有存放用户记录
的叶子节点代表的数据页可以存放 100条用户记录 ,所有存放目录项记录的内节点代表的数据页可以存放 1000条目录项记录 ,那么:
如果B+树只有1层,也就是只有1个用于存放用户记录的节点,最多能存放 100 条记录。
如果B+树有2层,最多能存放 1000×100=10,0000 条记录。
如果B+树有3层,最多能存放 1000×1000×100=1,0000,0000 条记录。
如果B+树有4层,最多能存放 1000×1000×1000×100=1000,0000,0000 条记录。相当多的记
录!!!你的表里能存放 100000000000 条记录吗?所以一般情况下,我们 用到的B+树都不会超过4层 ,那我们通过主键值去查找某条记录最多只需要做4个页面内的查找(查找3个目录项页和一个用户记录页),又因为在每个页面内有所谓的 Page Directory (页目录),所以在页面内也可以通过 二分法 实现快速定位记录。

 B-Tree 和 B+Tree 的区别:

  • B+Tree中只有叶子节点会带有指向记录的指针,而BTree则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。

  • B+Tree中所有叶子节点都是通过指针连接在一起,而BTree不会。

三、常见索引概念

1、索引按照物理实现方式,索引可以分为 2 种:聚簇(聚集)和非聚簇(非聚集)索引。我们也把非聚集索引称为二级索引或者辅助索引。MyISAM的索引方式都是“非聚簇”的,InnoDB包含1个聚簇索引是不同的。
聚簇类型B+TREE索引图


聚簇索引特点:
使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:页内 的记录是按照主键的大小顺序排成一个 单向链表 。各个存放 用户记录的页 也是根据页中用户记录的主键大小顺序排成一个 双向链表 。存放 目录项记录的页 分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个 双向链表 。B+树的 叶子节点 存储的是完整的用户记录。所谓完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列)。
优点:
数据访问更快 ,因为聚簇索引将索引和数据保存在同一个B+树中,因此从聚簇索引中获取数据比非聚簇索引更快聚簇索引对于主键的 排序查找 和 范围查找 速度非常快按照聚簇索引排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多个数据块中提取数据,所以 节省了大量的io操作 。
缺点:
插入速度严重依赖于插入顺序 ,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键更新主键的代价很高 ,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。

2. 二级索引(辅助索引、非聚簇索引、其他索引)

3、回表的概念

在MySQL数据库中,回表(也称为回源)是一种查询执行计划的操作,通常与索引相关。回表发生在使用索引查找数据行后,MySQL需要进一步检索其他数据列的情况下,例如查询一条完整的用户记录需要使用到 2 棵B+树。典型的数据库表包含多个列,而不仅仅是主键或索引列。当你执行一个SQL查询时,如果查询条件可以由索引满足,MySQL可能会首先使用索引找到满足条件的行的主键或行标识符。然后,MySQL需要”回表”来检索其他未包含在索引中的列的数据。这通常涉及到对磁盘上的实际数据行进行额外的I/O操作。
4、联合索引
我们也可以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让B+树按照 c2和c3列 的大小进行排序,这个包含两层含义:先把各个记录和页按照c2列进行排序。
在记录的c2列相同的情况下,采用c3列进行排序注意一点,以c2和c3列的大小为排序规则建立的B+树称为 联合索引 ,本质上也是一个二级索引。它的意思与分别为c2和c3列分别建立索引的表述是不同的,不同点如下:建立 联合索引 只会建立如上图一样的1棵B+树。为c2和c3列分别建立索引会分别以c2和c3列的大小为排序规则建立2棵B+树。

四、MyISAM 与 InnoDB索引对比
生产中常用InnoDB引擎所以对MyISAM引擎索引没有多介绍

MyISAM的索引方式都是“非聚簇”的,与InnoDB包含1个聚簇索引是不同的。小结两种引擎中索引的区别:

① 在InnoDB存储引擎中,只需要根据主键值对聚簇索引 进行一次查找就能找到对应的记录,而在MyISAM中却需要进行一次 回表操作,意味着MyISAM中建立的索引相当于全部都是 二级索引 。
② InnoDB的数据文件本身就是索引文件,而MyISAM索引文件和数据文件是分离的 ,索引文件仅保存数据记录的地址。
③ InnoDB的非聚簇索引data域存储相应记录 主键的值 ,而MyISAM索引记录的是 地址 。换句话说,InnoDB的所有非聚簇索引都引用主键作为data域。
④ MyISAM的回表操作是十分 快速 的,因为是拿着地址偏移量直接到文件中取数据的,反观InnoDB是通过获取主键之后再去聚簇索引里找记录,虽然说也不慢,但还是比不上直接用地址去访问。
⑤ InnoDB要求表 必须有主键 ( MyISAM可以没有 )。如果没有显式指定,则MySQL系统会自动选择一个可以非空且唯一标识数据记录的列作为主键。如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

推荐大佬博文

面试篇:MySQL_mysql面试-CSDN博客文章浏览阅读3.3k次,点赞6次,收藏24次。索引(index)是帮助MySQL高效获取数据的数据结构(有序)提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗嗯,索引在项目中还是比较常见的,它是帮助MySOL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的10成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗如果存在主键,主键索引就是聚集索引。如果不存在主键,将使用第一个唯一 (UNIQUE) 索作为聚集索引。_mysql面试https://blog.csdn.net/weixin_55127182/article/details/130291561+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


 

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

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

相关文章

Python2048小游戏核心算法(python系列26)

前言:做核心算法之前我们可以玩一玩这个小游戏来了解一下规则。2048在线试玩 运行效果: 代码案例: # 2048小游戏# 1.将列表中零移动到列表的末尾 def move_zeroes():x 0for i in range(len(list_nums)):if list_nums[i] ! 0:list_nums[x],…

“单项突出”的赢双科技IPO加速,比亚迪是最强助力?

近日,新能源汽车核心部件供应商赢双科技首次递表科创板,其凭借旋转变压器产品就坐稳了新能源车企主要供应商的地位,从核心业务及业绩情况来看,赢双科技不愧为“单项冠军”。 据悉,赢双科技本次IPO拟募资8.47亿元&…

两种MinIO分布式集群部署方式

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 相关文章推荐: 对象存储MinIO的简介与部署 记录一次跨越16个月的minio版本升级与数据迁移 MinIO集群怎么接入Prometh…

文字识别与光学字符识别有什么区别?

随着科技的不断发展,文字识别和光学字符识别技术已经成为我们日常生活和工作中不可或缺的一部分。然而,许多人对于这两者之间的区别并不十分清楚。本文将详细探讨文字识别与光学字符识别之间的差异,以帮助读者更好地理解这两种技术。 文字识…

Unity组件开发--相机跟随角色和旋转

1.相机跟随组件,节点: 2.相机跟随组件脚本: using System; using System.Collections; using System.Collections.Generic; using Unity.Burst.Intrinsics; using UnityEngine; using UnityEngine.UI;public class CameraFollow : Singleton&…

apk反编译修改教程系列---修改apk包名等信息 让一个应用拥有无限分身 手机电脑同步演示【九】

往期教程: apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 apk反编译修改教程系列---简单…

Rust 常用集合(上)

目录 1、使用 Vector 储存列表 1.1 新建 vector 1.2 更新 vector 1.3 读取 vector 的元素 1.4 遍历 vector 中的元素 1.5 使用枚举来储存多种类型 1.6 丢弃 vector 时也会丢弃其所有元素 2、使用字符串储存 UTF-8 编码的文本 2.1 什么是字符串? 2.2 新建字…

联邦机构如何利用人工智能加速 IT 系统现代化

尽管行业压力巨大,许多公共部门组织仍然需要依赖已有数十年历史的遗留 IT 系统,这些系统可能会增加安全风险和成本,导致人员短缺,并减缓开发团队交付关键任务应用程序的速度。 与此同时,考虑到这些大型系统中内存不安…

设计模式的艺术P1基础—2.3 类之间的关系

设计模式的艺术P1基础—2.3 类之间的关系 在软件系统中,类并不是孤立存在的,类与类之间存在各种关系。对于不同类型的关系,UML提供了不同的表示方式 1.关联关系 关联(Association)关系是类与类之间最常用…

k8s yaml文件pod的生命周期

Pod是k8s中最小限额资源管理组件,也是最小化运行容器化的应用的资源管理对象。 Pod是一个抽象的概念,可以理解为一个或者多个容器化应用的集合。 在一个pod当中运行一个容器是最常用的方式。 在一个pod当中同时运行多个容器,在一个pod当中…

异常处理:全面覆盖与精细化管理的平衡

异常处理:全面覆盖与精细化管理的平衡 在软件开发中,异常处理是保证系统稳定性和用户体验的重要环节。对于是否应当全面覆盖所有异常并设立兜底机制,业界存在着两种主流思路:全面覆盖原则和精细化处理。如何在这两者间取得平衡&a…

1.框架介绍项目环境配置与项目启动!

目录 1.框架开发方向:2.项目启动与环境搭建 1.框架开发方向: 1.前后端分离项目 2.纯后端项目 3.移动端开发uni-app(ios、Android、H5、微信小程序) 4.内容管理系统2.项目启动与环境搭建 1.安装node.js 下载地址可以用nvm安装 便于运行前端项目https://blog.csdn.net/qq_58647…

webpack的性能优化(一)——分包优化

1.什么是分包?为什么要分包? 默认情况下,Webpack 会将所有代码构建成一个单独的包,这在小型项目通常不会有明显的性能问题,但伴随着项目的推进,包体积逐步增长可能会导致应用的响应耗时越来越长。归根结底这…

led恒流式驱动电源芯片一览表

LED恒流式驱动电源芯片是一种用于驱动LED灯的关键组件。它能够稳定地提供恒定的电流,确保LED灯的亮度和颜色始终保持一致。 LED恒流式驱动电源芯片通常由电源管理单元、恒流输出部分和保护电路组成。电源管理单元负责转换输入电压为恒定的直流电压,并通…

App Crawler

Google官方出了一款App遍历工具App Crawler。 文档:应用抓取工具 | Android 开发者 | Android Developers App Crawler工具是Android Jetpack的一部分,它可自动的运行你的App,不需要编写或维护任何代码。 通过App Crawler运行App&…

数字后端设计实现之自动化useful skew技术(Concurrent Clock Data)

在数字IC后端设计实现过程中,我们一直强调做时钟树综合要把clock skew做到最小。原因是clock skew的存在对整体设计的timing是不利的。 但是具体到某些timing path,可能它的local clock skew对timing是有帮助的,比如如下图所示。 第一级FF到第…

简单易懂的PyTorch激活函数大全详解

目录 torch.nn子模块Non-linear Activations nn.ELU 主要特点与注意事项 使用方法与技巧 示例代码 图示 nn.Hardshrink Hardshrink函数定义 参数 形状 示例代码 图示 nn.Hardsigmoid Hardsigmoid函数定义 参数 形状 示例代码 图示 nn.Hardtanh HardTanh函数…

windows系统升级

问题 windows系统升级 详细问题 笔者手边有台电脑,操作系统版本为windowsXP,现需要升级至windows较新版本 解决方案 1、 内容备份 若C盘有重要数据文件 ,对于C盘(重要数据文件)进行备份 2、下载软件天猫一键重装…

【数据结构】数据结构中应用题大全(完结)

自己在学习过程中总结了DS中几乎所有的应用题,可以用于速通期末考/考研/各种考试。很多方法来源于B站大佬,底层原理本文不做过多介绍,建议自己研究。例题大部分选自紫皮严书。pdf版在主页资源 一、递归时间/空间分析 1.时间复杂度的分析 设…

MySQL之子查询、连接查询(内外)以及分页查询(实操)

文章目录 前言一、SQL脚本二、实操以及实现思路 前言 续上篇博主MySQL之视图&索引&执行计划这篇给大家讲解MySQL之子查询、连接查询(内&外)以及分页查询 一、SQL脚本 /*Navicat Premium Data TransferSource Server : localhostSource Server Type :…