面试灵活拷问:对于数据库的索引,你是怎么理解的?

news2025/1/17 8:56:38

一、索引的概念及作用

概念

作名词来讲,索引是一种特殊的文件,包含着对数据表中所有记录的引用指针。可以对表中的一列或者多列创建索引,并且指定所以的类型,各类索引有各自的数据结构实现。

作动词来讲,索引是一种利用某种规则的数据结构与实际的数据关系加快数据查找的功能。索引数据节点中有着实际文件的位置,原因是索引是根据特定的规则和算法构建的。

在查找的时候遵循索引的规则可以快速查找对应数据的节点,从而达到快速查找数据的效果。

其实宏观来讲,索引是具体的某项技术,在生活中索引的使用无处不在,比如说,书本中的目录,读书时的座位号,考试编号等等。只要是通过特定结构能够加快查找效率基本上就可以算是索引。

作用

帮助快速定位、检索数据。

二、索引的应用场景

  1. 数据量较大,且经常对这些列进行条件查询

  2. 该数据库表的插入操作,及对这些列的修改操作频率较低

不适用的情景:

  1. 对于插入、删除数据频率高的表,不适用索引
  2. 对于某列修改频率高的,该列不适用索引
  3. 通过某列或某几列的条件查询频率高的,可以对这些列创建索引

说明:

  1. 提高了空间的开销:虽然很多时候提高了查询效率,但同时也提高了增删改的开销,因为构造索引也就需要额外的硬盘空间来保存。
  2. 多数情况下,查的概率远大于增删改的频率。当数量非常大的时候,我们可以将查询数据看成主要矛盾,增删改数据看成次要矛盾,问题的解决主要看主要矛盾。
  3. 索引不是有了一定好,要付出一定代价的。具体是不是要设置索引需要看数据量。具体问题具体分析

三、索引的相关语法

1.查询索引

语法:show index from 表名;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n67Biy1E-1668592666424)(F:\typora插图\image-20221116172613512.png)]

2.创建索引

语法:create index 索引名 on 表名(字段名);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBqiK08u-1668592666425)(F:\typora插图\image-20221116173006502.png)]

3.删除索引

语法:drop index 索引名 on 表名;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LKu3iMKP-1668592666426)(F:\typora插图\image-20221116173044459.png)]

注意

  1. 对于一个表,如果没有显示定义索引。但是表中这一列有主键、唯一键、外键这一列就会自动创建索引。
  2. 当数据量非常大的时候,创建索引、删除索引是危险的操作。原因是这样很容易把磁盘的IO吃满。

四、索引背后的数据结构

不同的数据库,不同的引擎,里边存储数据的结构还有差异。这里我们介绍的是mysql中索引背后的数据结构——B+树。

什么是B+树

B+树是一种平衡的多路搜索树。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvIXLS7d-1668592666427)(F:\typora插图\B+树.png)]

B+树有什么特点

  1. B+树是一个N叉搜索树,每个节点都可能包含n个key,N个key划分出n个区间,最后一个key是最大值。
  2. 父元素的key会在子元素中重复出现,并且是以最大值的姿态进行出现。
  3. 所有元素会以叶子结点,用类似链表的方式,首尾相连。

相较于B树,B+树有一点区别就是会重复出现元素,这样的重复有什么意义呢?

答:这样的重复出现,使得叶子结点就包含了所有数据的全集。

所有非叶子结点中的值都会在叶子结点中体现出来。

采用B+树结构能为索引带来什么好处

  1. 继承了二叉搜索树快速搜索元素的特点,同时把高度降下来后,时间复杂度也降了下来。比较的时候,硬盘IO次数随之减少,查询效率得以提高。
  2. 更适合进行范围查询
  3. 所有的查询,都是要落在叶子结点上,使得查询次数比较均衡(每个节点都是在硬盘上的,B树就存在查询次数不均匀的问题)
  4. 由于所有key都会在叶子结点中体现因此非叶子结点,不必存表的真实记录。(不必都存数据行,进一步提高查询效率)【比如,我们可以存主键】

五、索引的分类

索引的分类标准不同,分类的结果自然而然也不同。这里我们主要按照数据库功能分类。

1.唯一索引(unique键对应的字段)

定义:唯一索引限制了在表对应的唯一索引列上的值是唯一不可重复的。

特点:

  1. 一个表可以创建多个唯一索引【多,但分散】
  2. 唯一索引的值允许为null
  3. 允许多个列建立统一唯一索引【组团】

2.主键索引(primary key 对应的字段)

定义:主键索引属于唯一索引的一个特殊种类,一个表的某列创建了主键索引后会具备唯一索引的功能同时还会对该列生成主键约束,所以简单来说主键索引是一种带有主键约束的唯一索引。

特点:

  1. 数据库在创建主键同时会自动建立一个唯一索引

  2. 每个表最多只能创建一个主键索引

  3. 创建了主键索引的列不允许有重复的值,并且不能为null值

  4. 创建了主键索引的列可以作为外键

3.聚集索引

定义:聚集索引属于聚簇索引的一个种类,在mysql中InnoDB数据引擎模式主索引就是使用的聚集索引,聚集索引的索引结构中就包含了表的数据。

特点:

  1. 一个表只能创建一个聚集索引
  2. 聚集索引尽量建在不会经常发生变动的列上,因为一旦列变动同时也会引索引结构变化,而索引结构中也包含者数据的变动
  3. 数据库在创建主键时如果这个表之前没有聚集索引,同时建立主键时候没有强制指定使用非聚集索引,则建立主键时候,同时建立一个唯一的聚集索引

六、索引在MySQL中使用方式

(1)在Mysql中索引是基于B+树的数据结构实现的;

(2)MyISAM数据引擎,表索引文件和数据文件是分离开的,主索引和辅助索引一样,只是有主键的区别,主索引的键不能重复;InnoDB中表索引本身就是表数据文件,索引节点中存的是表的数据而不是数据引用地址,辅索引完全依赖于主索引,辅索引的每次查找都是找到对应主索引的节点再找到数据;

(3)InnoDB中必须要有一个聚集索引,而聚集索引在基于主键创建的,所以InnoDB的表必须要有主键,如果没有显示指定主键,Mysql会自动创建一个隐式主键;

(4)InnoDB除了主索引(聚集索引)之外的索引都是以辅助索引的形式存在,辅助索引每次检索的时候是通过找到主索引再找到数据;

参考

参考1

参考2

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

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

相关文章

Selenium基础 — 拓展:使用浏览器加载项配置实现用户免登陆

1、什么是加载项配置 在很多情况下,我们在登录网站的时候,浏览器都会弹出一个是否保存登录账号的信息。如果我们选择保存,那么我们在下次登录时就不用再次输入账号,直接免登录了。 在我们实际的测试过程中,测试注册登…

系统运维利器,百万服务器运维实战总结!一文了解最新版SysAK|龙蜥技术

在刚刚结束的龙蜥峰会 eBPF & Linux 稳定性专场上,龙蜥系统运维 SIG Maintainer 张毅做了《SysAK 系统运维工具集》的主题演讲,以下为演讲实录。 大家好,在去年的云栖大会,我们在龙蜥社区开源了系统运维工具集 SysAK&#xff…

new Vue的时候到底做了什么

Vue加载流程 1.初始化的第一阶段是Vue实例也就是vm对象创建前后:首先Vue进行生命周期,事件初始化发生在beforeCreate生命周期函数前,然后进行数据监测和数据代理的初始化,也就是创建vm对象的过程,当vm对象创建完成就可…

【Linux】gcc的使用

文章目录一、前言二、gcc的基本使用1. 预处理2. 编译3. 汇编4. 链接三、函数库四、gcc常用选项总结一、前言 在学习本文前,我们先简单回顾一下源代码被转换为可执行的机器指令的每个过程: 预处理(进行宏替换)编译(生成汇编)汇编…

windows什么录屏软件好用,windows屏幕录制软件

大部分人的电脑都是windows电脑,所以很多人都在找适合windows系统的录屏工具,windows什么录屏软件好用?我们到底该选择哪个录屏工具呢?今天我们就来给大家介绍windows版本的录屏工具。 一、易我录屏助手 这个工具很多人都比较熟悉…

艾美捷人重组MEGACD40L蛋白(可溶性)实例展示

艾美捷人重组MEGACD40L蛋白(可溶性)是一种高活性蛋白质,其中两个三聚体CD40配体分子通过脂联素/ACRP30/AdipoQ的胶原结构域人工连接。这种蛋白质非常有效地模拟体内CD40L的自然膜辅助聚集。 艾美捷人重组MEGACD40L蛋白(可溶性&…

openEuler快速入门(二)-openEuler命令行基础操作

系列文章目录 第一章 openEuler快速入门(一)-openEuler操作系统介绍 文章目录系列文章目录前言一、shell是什么二、Linux命令行操作技巧三、基础命令3.1、Linux命令分类3.2、目录和文件3.2.1 相对路径和绝对路径3.2.2 处理目录的常用命令ls:cd:pwd&…

供应N3-PEG-COOH,Azide-PEG-acid,叠氮-聚乙二醇-羧基可增加溶解度

一:产品描述 1、名称 英文:Azide-PEG-acid,N3-PEG-COOH 中文:叠氮-聚乙二醇-羧基 2、CAS编号:N/A 3、所属分类:Azide PEG Carboxylic acid PEG 4、分子量:可定制,1000、2000、…

搭建Redis -Sentinel架构

准备服务器 master节点:192.168.1.121 从节点1:192.168.1.122 从节点2:192.168.1.123 安装详细步骤 1、下载安装包 https://redis.io/download/ 2、进入工作目录 $cd /home 3、解压安装包 $tar -zxvf redis-6.2.6.tar.gz 4、建立软连接 $l…

OpenCV_06 图像平滑:图像噪声+图像平滑+滤波

文章目录1 图像噪声1.1 椒盐噪声1.2 高斯噪声1.3 瑞利噪声1.4 伽马噪声1.5 指数噪声1.6 均匀噪声2 滤波器2.1 均值滤波器2.1.1 算数平均值滤波器2.1.2 几何均值滤波器2.1.3 谐波平均滤波器2.1.4 反谐波平均滤波器2.2 统计排序滤波器2.2.1 中值滤波器2.2.2 最大值滤波器2.2.3 最…

翻开spring源码横看竖看,满屏只有四个字,看不懂啊。幸好我有大神的深度剖析spring源码,轻松看懂

前言 有一天,我翻开源码横看竖看,满屏只看到四个字,我看不懂啊。 所以是不是曾和我一样迷失在毫无头绪的源码里,在各种类和方法里翻山越岭,却如同管中窥豹。是的话,要不今晚早点睡? 呸&#x…

前端学习路线(二)

在前端学习路线(一)一章中我们讲了关于前端三剑客和jq与js的问题,并且简要的说明了js高级是什么,那在本章节我们主要从如何学习js高级开始进行讲述,并对es6如何学习,bootstrap学不学和学什么,并…

Tomcat部署及优化

目录 一. Tomcat的介绍 1.2 Tomcat核心组件 1.2.1 核心组件的作用 1.3 servlet简介 1.4 JSP介绍 1.5 Tomcat功能组件结构 1.6 Tomcat请求过程 二.Tomcat服务部署 2..2 安装JDK​编辑​编辑​编辑 2.3 设置JDK环境变量​编辑​编辑 2.5 优化tomcat启动速度 2.6 tom…

【JavaScript】制作一个抢红包雨页面

开发H5项目,有时会遇到一个需求,需要制作抢红包,或者下红包雨的网页,这个实现步骤,如果拿现成的改来做是容易的,但是想着全靠自己做是不容易的,接下来开始讲,想不想自己做&#xff0…

嵌入式开发学习之--点亮LED灯(下)

上篇我们主要学习的是环境搭建和实际操作,这篇详细记录一下整个思考的过程。 首先,我们需要想一个问题,这个灯为什么会亮? 物理上来说,LED灯属于发光二极管,只要有正确的电压就会发亮。也就是说&#xff…

01 DevOps 之 Git 命令使用

1. 前言 由于项目没有外网,需要在内网打镜像。但自己对git 还不是太熟悉。看着pipline 一脸懵逼。所有针对git 命令在工作中常用的参数及用法简单学习记录下。因为git 是DevOps中的编码的一部分,下面先介绍下DevOps整体的框架。 1.1 DevOps介绍 DevOp…

Linux-磁盘分区,挂载

Linux分区 Linux来说无论有几个分区,分给哪一个目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成文件系统的一部分 Linux采用了一种载入的处理方法,它的整个文件系统包含了…

智能运维应用之道,告别企业数字化转型危机

面临的问题及挑战 数据中心发展历程 2000 年中国数据中心始建,至今已经历以下 3 大阶段。早期:离散型数据中心 IT 因以项目建设为导向,故缺乏规划且无专门运维管理体系,此外,开发建设完的项目均是独立运维维护&#…

rust编程初探-猜数游戏(chapter 2)

目录 1. 创建项目 2. 猜数的输入 3. 随机数生成 3.1 rand库依赖 3.2 随机数生成 4. 猜数和随机数的比对 4.1 std::cmp::Ordering类型 4.2 match表达式(expression) 4.3 输入类型的转换 5. 支持多次猜测(使用循环) 6. 错…

MySql学习之慢SQL优化和慢SQL案例

一、慢SQL优化思路 慢查询日志记录慢SQLexplain查询SQL的执行计划profile分析执行耗时Optimizer Trace分析详情 1、慢查询日志记录慢SQL show variables like slow_query_log%; show variables like long_query_time;查看下慢查询日志配置,我们可以使用show vari…