MySQL 索引篇

news2025/4/17 19:52:53

什么是索引,索引就相当于一本书的目录。通过索引可以快速查找到对应的数据。

索引常见面试题:

1. 索引的分类: 

按数据结构分类:

       

按物理存储分类:一般分为聚簇索引(主键索引),二级索引(辅助索引)

   主键索引的B+树的叶子节点上一般存储的是数据,所有完整的用户数据都存放在主键索引的叶子节点上

   二级索引的B+树的叶子节点上一般存储的是主键值,而不是实际数据。然后再通过主键值再查找到相应的数据,也就是说二级索引要经过两次查询。

   回表:

如果在二级索引的第一次查询中获得相应的数据,就不需要再进行一次查询。这就叫做覆盖索引。如果第一次查询中没有获得相应数据,只获得主键值,那么就需要再进行一次主键检索。这个过程就叫做回表。             

按字段特性分类:

      主键索引:主键索引就是建立在主键上的索引,一般在建表的时候创建,一张表只能有一个主键索引,并且主键索引的列的值不允许为空值。

      唯一索引:唯一索引建立在UNIQUE字段上的索引,一张表可以有多个唯一索引。索引列的值必须唯一,允许有空值。

      普通索引:建立在普通字段上的索引,既不要求字段为主键索引,也不要求字段为唯一索引。

      前缀索引:前缀索引是建立在字符型字段的前几个字符建立的索引。使用前缀索引的目的是减少索引占用的内存空间。提升查询效率。

按字段个数分类:

      单列索引:建立在单列字段上的索引

      联合索引:建立在多列字段上的索引(采用最左匹配原则)。

2. 什么时候需要创建索引 / 什么时候不需要创建索引

 索引的好处和缺点:

     索引最大的好处就是提高查询速度。

     索引的缺点:需要占用物理空间,数量越大,占用空间越大。

                          创建索引和维护索引需要耗费时间,这种时间随着数据量的增大而增大。索引就是典型的以空间换时间

                          会降低表的增删改查的效率,每次增删改查,B+数为了维护索引有序性,都要进行动态维护。

什么时候需要创建索引:

     字段有唯一性限制,就像商品编码

     经常用于where 语句查询语句的字段,这样能够提高整个表的查询效率。如果查询字段不是一个,可以进行联合查询。

      语句中含有ORDER BY和GROUP BY的字段,这样在进行查询时就不用去做一次排序。因为建立好索引之后,B+树上的数据都是有序的。

什么时候不需要查询数据:

      WHERE 和 ORDER BY 和 GROUP BY 用不到的语句。

      字段中出现大量的数据,比如性别字段,每次查询都只会出现一般的数据。

     表数据太少的时候不需要创建索引

     经常更新的字段,B+树需要维护数据的有序性,频繁的增删改查会影响数据库的性能。

3. 索引优化的方法

    前缀索引优化方法:前缀索引就是使用某个字段的前几个字符作为索引,在一些大的字段作为索引时,使用前缀索引可以减少索引项的大小。

    覆盖索引优化:在二级索引的查询中,如果在第一次查询就获得相应的数据,就可以避免回表操作。方法:我们可以建立一个联合查询。即「商品ID、名称、价格」作为一个联合索引。如果索引中存在这些数据,查询将不会再次检索主键索引,从而避免回表。

   主键最好是自增的:如果我们将主键设置为自增的,那么每增加一次数据就会按顺序添加到对应的叶子节点上。不需要移动数据。每插入一次新数据,都是追加操作。

  索引最好设置成NOT NULL:索引中出现NULL会让优化器在做索引选择时会更加麻烦。

NULL值是一个没意义的数据,但是会在行格式中的NULL值列表增加1KB的空间。

  防止索引失效:

  • 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;
  • 当我们在查询条件中对索引列做了计算、函数、类型转换操作,这些情况下都会造成索引失效;
  • 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
  • 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。

 

从数据页的角度看B+树

 Innodb是如何存储数据的

Innodb是按照数据页的形式读取数据的(以行的形式效率会很低),每个页默认大小为16KB,意味着数据库每次读取数据都是以16KB为单位,一次最少读取16KB的数据到内存中。一次最少把内存中16KB的数据刷新到磁盘中。

数据页的主要作用就是存储数据,也就是数据库里的数据。数据页中的记录按照主键顺序组成单向链表。单向链表的优点主要是方便插入和删除。但是检索效率不高。

数据页中有一个页目录,起到记录的检索作用。

每个槽相当于指针指向了不同组的最后一个记录。、

页目录就是由多个槽准备的,槽相当于分组记录的索引。我们查找数据可以通过二分法快速定位到对应的槽,在遍历槽内的所有记录,从而找到对应的记录。

B+树是如何进行查询的

 磁盘的I/O次数对索引的使用效率至关重要。因此,采用B+树是最合适的。

B+树中的每个节点都是一个数据页。

B+树中非叶子节点仅用来存放目录项来进行索引,B+树的叶子节点用来存放数据。

所有的节点按照索引键的大小排序,构成一个双向链表,便于范围查询。

为什么MySQL采用B+树的形式来存储数据

设计一个适合MySQL索引的数据结构需要满足以下几点

能在尽可能少的磁盘中进行I/O操作

能高效的查询一个记录,也要能高效的执行范围查找

 什么是二分查找

 二分查找每次都能将范围减半,时间复杂度会降低。

二分查找树

 

每一个节点的左子树的所有节点都小于这个节点。右子树的所有节点都大于这个节点。

自平衡二叉树

 

每个节点的左子树和右子树的高度差不能超过1 . 但是不管是平衡二叉树,随着插入数据的增多,树的高度也会增加。 也就意味着磁盘I/O的次数会增加。会影响整体查询效率。它每个节点都会有两个子节点。

B树

B树的每个子节点都会由多个子结点。降低了树的高度问题。

 B+树

 

B+ 树与 B 树差异的点,主要是以下这几点:

  • 叶子节点(最底部的节点)才会存放实际数据(索引+记录),非叶子节点只会存放索引;
  • 所有索引都会在叶子节点出现,叶子节点之间构成一个有序链表;
  • 非叶子节点的索引也会同时存在在子节点中,并且是在子节点中所有索引的最大(或最小)。
  • 非叶子节点中有多少个子节点,就有多少个索引;

  

                          

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

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

相关文章

【Java EE 初阶】文件操作

目录 1.什么是文件? 1.在cmd中查看指定目录的树形结构语法 2.文件路径 从当前目录开始找到目标程序(一个点) 返回到上一级目录,再找目标程序(两个点) 2.Java中文件操作 1.File概述 1.属性 2. 构造…

CENTO OS上的网络安全工具(二十二)Spark HA swarm容器化集群部署

在Hadoop集群swarm部署的基础上,我们更进一步,把Spark也拉进来。相对来说,在Hadoop搞定的情况下,Spark就简单多了。 一、下载Spark 之所以把这件事还要拿出来讲……当然是因为掉过坑。我安装的时候,hadoop是3.3.5&a…

Unity Metaverse(七)、基于环信IM SDK实现的好友系统、私聊、群聊

文章目录 🎈 简介🎈 用户管理🎈 好友管理🎈 聊天管理🔸 发送与接收消息🔸 消息处理消息项的对象池管理 🎈 简介 在之前的文章中已经介绍了如何接入环信IM Unity SDK,及基于该SDK实现…

使用Python 构建球体/正方体/多面体/兔子/八面体等点云,Open3D可视化及重建

使用Python 构建球体/正方体/多面体/兔子/八面体等点云,Open3D可视化及重建 点云生成8面体点并拟合绘制表面重建结果。(官方示例兔子,8面体,多面体,球体) 1. 效果图8面体多面体效果图**俩个整8面体效果图**…

学生宿舍信息管理系统

系列文章 任务6 学生宿舍信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试宿舍信息录入宿舍信息浏览查询学生所住宿舍楼号、宿舍号…

WPF MaterialDesign 初学项目实战(6):设计首页(2),设置样式触发器

原项目视频 WPF项目实战合集(2022终结版) 26P 源码地址 WPF项目源码 其他内容 WPF MaterialDesign 初学项目实战(0):github 项目Demo运行 WPF MaterialDesign 初学项目实战(1)首页搭建 WPF MaterialDesign 初学项目实战&…

npm、cnpm、yarn、pnpm区别以及pnpm 是凭什么对 npm 和 yarn 降维打击的

安装 1、安装npm需要安装nodejs,node中自带npm包管理器 node下载地址:node.js 2、cnpm安装(需要安装npm) cnpm是淘宝团队做的npm镜像,淘宝镜像每 10分钟 进行一次同步以保证尽量与官方服务同步。 npm install -g …

secure CRT 自定义主题

文章目录 如何切换 SecureCRT 主题如何新建SecureCRT 主题如何拷贝我的主题,主题名为pic如何设置 SecureCRT 关键字高亮 如何切换 SecureCRT 主题 SecureCRT 自带主题 选择 options -> Edit Default Session -> Terminal -> Emulation -> Terminal xterm optio…

【Linux】-vim的介绍,教你手把手使用vim

💖作者:小树苗渴望变成参天大树 ❤️‍🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点…

一台电脑同时安装多个tomcat服务器教程,window同时安装tomcat7、tomcat8、tomcat9三个服务器教程

一台电脑同时安装多个tomcat服务器 . 介绍 A. 解释为什么有时需要同时安装多个Tomcat服务器 应用程序隔离:当你需要在同一台设备上运行多个独立的应用程序时,每个应用程序可能需要使用不同的Tomcat配置和环境。通过同时安装多个Tomcat服务器&#xff0…

车载以太网 - SomeIP - 协议用例 - Messages_02

目录 13.1、验证SomeIP-SD中订阅报文Subscribe和SubscribeAck中IPv4 Endpoint Option中ServiceID一样

【JAVA进阶】Stream流

📃个人主页:个人主页 🔥系列专栏:JAVASE基础 目录 1.Stream流的概述 2.Stream流的获取 3.Stream流的常用方法 1.Stream流的概述 什么是Stream流? 在Java 8中,得益于Lambda所带来的函数式编程&#xff0…

HNU数据结构与算法分析-作业4-图结构

1. (简答题) 【应用题】11.3 (a)画出所示图的相邻矩阵表示 (b)画出所示图的邻接表表示 (c)如果每一个指针需要4字节,每一项顶点的标号占用2字节,每一条边的权需要2字节&#xff0…

计算机体系结构存储系统

存储系统原理 两种典型的存储系统:Cache存储系统和虚拟存储系统。前者主要目的是提高存储器速度,后者有主存储器和硬盘构成,主要用于扩大存储器容量。 存储系统的访问效率 e T 1 T 1 H ( 1 − H ) T 2 T 1 f ( H , T 2 T 1 ) e\frac{T_…

魔改车钥匙实现远程控车:(4)基于compose和经典蓝牙编写一个控制APP

前言 这篇文章不出意外的话应该是魔改车钥匙系列的最后一篇了,自此我们的魔改计划除了最后的布线和安装外已经全部完成了。 不过由于布线以及安装不属于编程技术范围,且我也是第一次做,就不献丑继续写一篇文章了。 在前面的文章中&#xf…

基于torch实现模型剪枝

一、剪枝分类 所谓模型剪枝,其实是一种从神经网络中移除"不必要"权重或偏差(weigths/bias)的模型压缩技术。关于什么参数才是“不必要的”,这是一个目前依然在研究的领域。 1.1、非结构化剪枝 非结构化剪枝(…

什么是可持续能源?

随着全球经济的不断发展和人口的不断增长,能源问题越来越受到关注。传统能源已经不能满足人们对能源的需求,同时也对环境和健康带来了严重的影响。为了解决这些问题,出现了可持续能源的概念。那么,什么是可持续能源呢?…

逐渐从土里长出来的小花

从土里逐渐长出来的小花&#xff08;这是长出来后的样子&#xff0c;图片压缩了出现了重影~&#xff09; 代码在这里&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title&g…

MySQL-索引(2)

本文主要讲解MySQL-索引相关的知识点 联合索引前缀索引覆盖索引索引下推索引的优缺点什么时候适合创建索引,什么时候不适合?如何优化索引 ? 索引失效场景 ? 为什么SQL语句使用了索引,却还是慢查询 ? 使用索引有哪些注意事项 ? InnoDB引擎中的索引策略 目录 联合索引 联合…

LeetCode高频算法刷题记录6

文章目录 1. 编辑距离【困难】1.1 题目描述1.2 解题思路1.3 代码实现 2. 寻找两个正序数组的中位数【困难】2.1 题目描述2.2 解题思路2.3 代码实现 3. 合并区间【中等】3.1 题目描述3.2 解题思路3.3 代码实现 4. 爬楼梯【简单】4.1 题目描述4.2 解题思路4.3 代码实现 5. 排序链…