爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      MySQL经典面试题:谈一谈对于数据库索引的理解~~

      首页 知识中心 数据库 文章详情页

      MySQL经典面试题:谈一谈对于数据库索引的理解~~

      2024-11-07 08:15:30 阅读次数:31

      查询,索引,节点

       

      什么是索引?

      数据库中的索引,就相当于一本书的目录。
      什么是书的目录?相信大家都并不陌生,一本书最前面的几页,一般就是目录,如果你想找到某个章节,你就可以通过目录快速定位过去。
      同理,在数据库中通过索引,我们就可以快速找到要查询的数据(索引的作用)。

      为什么要引入索引?

      在数据库中 select 这样的查询操作,默认是按照“遍历”的方式,来完成查询的。

      比如,指定where语句,条件查询,遍历每一行,把这一行数据代入到条件中,看是否成立,成立就留下,不成立就pass掉。

      遍历的复杂度是O(n),但是要注意,此处的每一次取一行,都是要读硬盘的!!虽然也是O(n),但是它和内存操作的O(n)是有本质区别的~~在硬盘上进行操作,比在内存上进行操作,速度要差了好几个数量级呐!!差距还是非常大的。通过一行一行遍历,这样的操作,就会很慢,非常消耗数据库的资源,这也就使数据库能处理的请求量更少了。因此,为了加快查询速度,就需要在数据库中建立索引。
      所谓的“索引”就相当于是在数据库中,构建一个特殊的“目录”(一系列特定的数据结构,在硬盘上的),通过这样的数据结构,加快查询的速度,尽可能避免对数据库的遍历操作。

      大家应该都用过everything这个软件吧,everything其实就是针对硬盘文件,进行搜索的,那为啥它能查找的这么快?这是因为everything提前把硬盘上的文件数据,构成了特定的数据结构,查询的时候不必遍历了,直接就能进行快速查询。

      引入索引的代价

      虽然索引这么好,但是也付出了一点的代价。

      1. 引入索引,需要消耗额外的存储空间。
        举个例子来方便理解:假设你有一本词典,词典特别厚(上千页),查词的时候肯定要通过目录来查,这个时候,你仔细观察一下目录的页数,词典的目录 可能就是厚厚的一打。印目录也需要纸张呀~

      2. 引入索引之后,确实能提高查询的效率,但是可能会影响到增删改的效率。有时候会变慢,比如在进行增删改的时候,需要同步的更新维护索引,更新过程肯定是有额外的开销的;有时候会变快,比如通过条件判断的方式来删除,而删除操作的背后就有查找操作,而索引可以帮我们快速定位;有的时候没有变化。

      由此看来,索引这个东西,有利有弊,但是即使如此,我们在实际开发中,还是比较鼓励使用索引的。

      原因:

      1. 存储空间(硬盘)往往不是主要矛盾,大不了多加几个。
      2. 索引对于增删改也不一定都是负面影响,也可能会触发一些正面效果,另一方面,很多业务场景,查询的频率比增删改要高很多…

      操作索引的SQL语句

      1. 查看索引
      show index from 表名;
      

      MySQL会给主键自动生成索引,不需要我们手动创建。
      所谓的“索引”是按照 列 的方式来创建的,可以给某个列创建索引,只有在对这个列进行条件查询的时候,索引才能够生效,才能够提升查询速度~~
      一个表允许有多个索引(一本词典可能有多种目录(拼音目录、部首目录、笔画目录…))
      除了主键之外,unique 和 foreign key 也会自带索引~~这也很容易理解,在子表中插入\修改,需要查询父表;在父表中进行修改\删除,也需要查询子表

      1. 创建索引
      create index 索引名 on  表名(列名);
      

      创建索引也是一个“危险操作”
      如果是针对空表,或者表中的数据比较少(几千、几万…),此时创建索引就谈不上危险不危险。
      一旦表的数据量比较大,千万级别…此时创建索引操作,就可能会触发大量的硬盘IO,直接把机器就搞的卡死住了,所以一定要在最初创建表的时候,提前规划好这个表要有哪些索引。

      如果就是要创建呢?
      可以再申请一台机器,将旧库的数据导入到新库当中,等数据全都导入完毕之后,再切换我们访问数据库的那个程序,让他从访问旧库,变成访问新库。

      1. 删除索引
      drop index 索引名 on 表名;
      

      它只能删除,我们自己创建的索引,不能删除MySQL自动生成的(主键、外键、unique…)。

      删除索引也是危险操作!!
      要能够慎重对待~

      索引背后的数据结构

      所谓的“构建索引”其实就是引入一些数据结构,对数据进行存储,从而提高查找的速度。

      二叉搜索树和哈希表,都不适合给数据库做索引

      1. 二叉搜索树,最大的问题在于“二叉”要保存的元素多的时候,就会使整个树的高度变的比较高,一旦高度高了,比较次数就会增多~~要知道这是在硬盘上进行的比较,每多比较一次,都是很伤的!!

      2. 哈希表,最大的问题在于,只能进行“相等”查询,无法进行 > < 这样的“范围查询”,也无法进行like模糊查询。哈希表是要通过哈希函数,把查询的key映射成数组下标,不是说key1 < key2 => hash(key1) < hash(key2);

      B树

      B+树,为数据库量身定制的数据结构。
      要想了解B+树,首先要对B树有一定的了解,B树,也可以写作B - 树(这里 - 不是减号,而是连接符)

      B树其实就是N叉搜索树,每个节点,可以有多个子树了(树的度是N)
      这样就可以降低树的高度了~每个节点上就不是存储一个key值了,而是多个了

      MySQL经典面试题:谈一谈对于数据库索引的理解~~

      某个节点上保存了N个key就能延伸出N+1个子树了,此时,进行查询的时候,针对每个节点,都需要比较多次,才能确定下一步走哪个区间~~

      有人就要问了此时虽然高度降低了,但是每个节点的比较次数变多了,真的能比二叉树有优势吗?
      答:其实优势还是很大的!!每个节点,访问的时候是一次硬盘IO就可以了~~
      和某个节点进行比较的时候,是先一次硬盘IO,把所有的这个节点上的内容都读取出来,接下来的比较就都是在内存中进行的了

      注意:这里的主要目的,不是为了减少比较的次数,而是要减少硬盘IO的次数

      B+ 树

      B+树是针对B树做出的进一步改进的数据结构~~

      MySQL经典面试题:谈一谈对于数据库索引的理解~~

      B+树也是N叉搜索树

      1. 不同于B树,B树是有N个key,划分成N+1个区间,B+树是有N个key,划分出N的区间~

      2. 父节点中的key值,会在下面的子节点中再次出现(以子节点中的最大值的身份)~~ 重复出现的做法,看起来好像是浪费空间,实际上非常有用~~所有叶子结点,就构成了整个树数据的全集!!

      3. B+树把叶子节点,像链表一样首尾相连了~~此时,进行“范围查询”就会非常方便!!

      B+ 树的优势:

      1. N叉搜索树,高度比较低,此时硬盘IO次数就比较少
      2. 叶子结点是全集,并且用链表结构连接,非常便于进行范围查询~~
      3. B+树,所有的查询都是要落到叶子结点上完成的~~并且任何一次查询,经历的IO次数和比较次数都是差不多的,查询的开销是稳定的~~(稳定其实是一个很大的优势!!稳定意味着,成本是容易被预估出来的~)
      4. 由于B+树,叶子结点是全集,非叶子结点上不必存储“数据行”(数据库中的“表”只是一个逻辑上的结构,在物理上并非是一个真正意义的表~物理上就是通过B+树这样的结构来组织的~),只需要存储索引列的key即可。这使得非叶子结点,消耗的空间较少,甚至这样的数据可以直接全部都加载到内存中~~这样又能进一步减少硬盘IO的次数~~

      回顾思考

      1. 索引是啥,它是解决啥问题的?
      2. 索引付出了什么代价?
      3. 如何使用 sql 操作索引,是否又注意事项?
      4. 索引背后的数据结构? => B+树的特点和优势?

      解答:

      1. 索引是啥,它是解决啥问题的?
        索引相当于书的目录,能够提高查询的速度

      2. 索引付出了什么代价?

        1. 需要更多的存储空间
        2. 可能会影响增删改的效率(不一定会影响)
          整体来说,索引利大于弊,日常开放中还是会经常使用的
      3. 如何使用 sql 操作索引,是否又注意事项?

        1. show index from 表名;
          查看索引(主键、外键、unique会自动生成索引)
        2. create index 索引名 on 表名(列名);
          给指定列创建索引
        3. drop index 索引名 on 表名;
          删除索引
        4. 索引是针对列来创建的,后续查询的时候,查询条件使用的列和索引列匹配,索引才能生效,才能提高效率。
        5. 针对一个比较大的表,创建\删除索引,是非常危险的,可能会触发大量的硬盘IO,把机器搞挂了
      4. 索引背后的数据结构? => B+树的特点和优势?

        1. 特点:
          1. N叉搜索树,每个节点上包含N个 key,划分出N个区间
          2. 每个父节点中的元素,都会下沉到子节点中,作为该子节点中最大值的角色来存在
          3. 叶子结点这一层就构成了数据集合的全集
          4. 使用类似于链表这样的结构,把叶子节点串起来
        2. 优势
          1. N叉搜索树,高度比较低,降低了硬盘IO次数
          2. 范围查询非常方便和高效
          3. 所有的查询都落到叶子节点上,开销非常稳定,容易预估成本
          4. 叶子节点存储数据行,非叶子节点只存储索引列的key值,非叶子节点占据空间小,可以加载到内存中,进一步减少查询时IO的访问次数。
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/qrwitu142857/article/details/139420470,作者:月临水,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Mysql--横表纵表

      下一篇:每日一练

      相关文章

      2025-05-19 09:04:44

      spark控制台没显示其他机器

      spark控制台没显示其他机器

      2025-05-19 09:04:44
      Spark , 节点 , 集群
      2025-05-19 09:04:38

      mysql只有在任务处于完成状态才能运行

      mysql只有在任务处于完成状态才能运行

      2025-05-19 09:04:38
      MySQL , 任务 , 数据库 , 查询 , 状态
      2025-05-19 09:04:14

      二叉树经典OJ练习

      二叉树经典OJ练习

      2025-05-19 09:04:14
      root , 二叉树 , 子树 , 节点 , 遍历
      2025-05-16 09:15:17

      MySQL 复合查询(重点)

      MySQL 复合查询(重点)

      2025-05-16 09:15:17
      员工 , 多表 , 工资 , 查询
      2025-05-14 10:33:16

      30天拿下Rust之切片

      在Rust中,切片是一种非常重要的引用类型。它允许你安全地引用一段连续内存中的数据,而不需要拥有这些数据的所有权。切片不包含分配的内存空间,它仅仅是一个指向数据开始位置和长度的数据结构。

      2025-05-14 10:33:16
      amp , end , 切片 , 字符串 , 引用 , 索引 , 迭代
      2025-05-14 10:33:16

      30天拿下Rust之向量

      在Rust语言中,向量(Vector)是一种动态数组类型,可以存储相同类型的元素,并且可以在运行时改变大小。向量是Rust标准库中的一部分,位于std::vec模块中。

      2025-05-14 10:33:16
      Rust , 使用 , 元素 , 向量 , 方法 , 索引 , 迭代
      2025-05-14 10:03:13

      MySQL 索引优化以及慢查询优化

      MySQL 是一种广泛使用的关系型数据库管理系统,因其性能优异和使用便捷而备受欢迎。然而,随着数据量的增长和查询复杂度的增加,性能瓶颈也变得越来越明显。

      2025-05-14 10:03:13
      MySQL , 优化 , 使用 , 性能 , 数据库 , 查询 , 索引
      2025-05-14 10:03:13

      【MySQL】-数据库优化(索引)

      索引(index)是帮助数据库高效获取数据的数据结构

      2025-05-14 10:03:13
      index , Tree , 二叉 , 搜索 , 数据 , 索引 , 节点
      2025-05-14 10:02:48

      MongoDB常用管理命令(1)

      MongoDB常用管理命令(1)

      2025-05-14 10:02:48
      会话 , 命令 , 操作 , 节点
      2025-05-14 10:02:48

      SQL Server 执行计划1--数据查询

      SQL语言(在SQL Server也叫做T-SQL)是一个解释性的语言(declarative language), 主要是描述的是人想要从数据库里获取数据的逻辑。但数据库接收到SQL语句后,会根据相关的统计信息制定自己的取数策略(执行计划)。

      2025-05-14 10:02:48
      Index , 查找 , 索引
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5244106

      查看更多

      最新文章

      mysql只有在任务处于完成状态才能运行

      2025-05-19 09:04:38

      MySQL 复合查询(重点)

      2025-05-16 09:15:17

      30天拿下Rust之切片

      2025-05-14 10:33:16

      【MySQL】-数据库优化(索引)

      2025-05-14 10:03:13

      MySQL 索引优化以及慢查询优化

      2025-05-14 10:03:13

      mysql数据库中decimal数据类型比较大小

      2025-05-14 09:51:21

      查看更多

      热门文章

      正确理解Mysql的列索引和多列索引

      2023-05-12 07:20:42

      Oracle基础查询练习(三)

      2023-05-10 06:02:16

      MariaDB 数据库之索引详解

      2023-05-19 02:21:24

      【DB笔试面试352】在Oracle数据库中,哪些操作会导致索引失效?

      2023-06-16 06:12:34

      mysql范围查询场景下的自适应跳表索引-第二版-改进点

      2023-06-20 09:19:26

      PostgreSQL递归查询

      2023-06-19 06:57:10

      查看更多

      热门标签

      数据库 mysql 字符串 数据结构 MySQL 算法 redis oracle java sql python 数据 索引 SQL 查询
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      ​数据结构之初始二叉树-相同的树

      Oracle查询表结构、索引和备注

      第四章数据查询基础

      MySQL—多表查询—练习(1)

      每日学习一个数据结构-FST数据结构与算法

      记一次线上数据库删除百万级数据

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号