爆款云主机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索引

      2023-06-14 09:13:23 阅读次数:95

      mysql,索引

      最近看了一些MySQL相关的书籍和视频太多了,好东西如果不记录一下就会忘记,这里我记录一下感觉是重点的东西。
      这里只说InnoDB引擎

      关于索引,我们需要知道哪些东西?

      1.从原理上说为什么要使用索引?

        使用索引避免全表扫描,提高检索效率,使用索引后就维护了一颗B+树,B+树是为磁盘或者其他直接存取辅助设备设计的一种平衡查找树,在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子结点,各叶子结点通过指针进行连接(这里我默认大家最最基本的数据结构知识都会)。

        先给出最简单一张图示意理解一下,但是这图是不全对,对于新手来说,可以用这张图理解概念,后面会说明

      博文看了这么多,终于理解了MySQL索引

       

        非叶子结点存放的就是目录,根据目录去找二分查找叶子结点中的记录,所有记录都在叶子结点上,并且是顺序存放的,如果查找的值小于25,那么就从前指针指向的叶子里去查找记录,如果大于25且小于50,那么就从25的后指针指向的叶子里去查找。

        图放出来就能理解了,全表扫描和建立索引扫描就像你遍历链表和遍历平衡二叉树一样,哪个快一眼就看得出来,建立索引后,你能二分很快定位叶子结点然后去遍历叶子结点的数据。

        当然大家也别误解,这个图是有点问题的,你可能会认为5、10、15、20是数组结构?其实是单链表结构,一个叶子结点是一个页,它是InnoDB管理存储空间的基本单位,一个页的大小是16KB,也就是最多能保证16KB的连续存储空间,各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表。所以上图省略了单链表结构,大家可千万不要以为是数组结构。

        有人会疑问,一个页大小是16KB,最多保证16KB连续存储空间,而单链表怎么能是连续存储空间呢,怎么看都像是数组。其实真正的示意图如下,这个是《MySQL是怎样运行的》书中的图,写的很好的书。

       

      博文看了这么多,终于理解了MySQL索引

        一个页不仅仅只是存放用户记录,还有很多头信息等标志位之类的东西,关于细节,大家可以看书,这里只说平时需要从逻辑上理解的东西,我们只需要看到User Records这一块空间,每插入一条记录单链表就多了一个结点,就要从Free Space这里申请一个记录大小的空间划分到User Records部分,内存不够就新增下一个页。

      来看看User Records里面是什么样的

      INSERT INTO index_demo VALUES(1, 4, 'u'), (3, 9, 'd'), (5, 3, 'y');

      插入3条记录,页中的数据是单链表结构

       

      博文看了这么多,终于理解了MySQL索引

      这里可以看到每条记录之间是单链表结构,并不是数组结构。

      如果大家对于B+树的插入和删除以及叶子左旋右旋感兴趣,可以阅读《MySQL技术内幕:SQL编程》一书。

      如果对数据库的用法理解已经出神入化了,可以进阶阅读以下《MySQL是怎样运行的》——作者: 小孩子4919

      2.什么样的信息能成为索引,数据结构时怎么样的?

        主键、唯一键或者能让数据有区分性的字段都能成为索引,数据结构主流的都是B+树。

      3.聚集索引和非聚集索引的区别

        B+树索引可以分为聚集索引与非聚集索引,两者的区别仅在于存放的数据内容。

        聚集索引是根据主键创建的一棵B+树,聚集索引的叶子结点不仅保存该列的键值信息,还保存了这一行数据记录的其他值信息,是一个完整的数据记录,聚集索引决定了表的物理排列顺序,一个表只能有一个聚集索引。

        非聚集索引(辅助索引)是根据索引键创建的一棵B+树,与聚集索引不同的是,其叶子节点仅存放索引键值,以及该索引键值指向的主键。非聚集索引定位到叶子结点后仍需要定位到主键信息来获取完整记录,其实这个过程就是回表。这种按照非主键列建立的B+树需要一次回表操作才可以定位到完整的用户记录,所以这种B+树也被称为二级索引(英文名secondary index),或者辅助索引。

        为什么我们还需要一次回表呢?直接把完整的用户记录放到叶子节点不就好了么?如果把完整的用户记录放到叶子节点是可以不用回表,但是太占空间了,每建立一棵B+树都需要把所有的用户记录再都拷贝一遍,这就有点太浪费存储空间了。

        辅助索引不包含行记录的所有数据,这就意味着每页可以存放更多的键值,因此其高度一般都要小于聚集索引。

      博文看了这么多,终于理解了MySQL索引

        这里只是一个例子,比如name列添加了索引,条件筛选name为Ellison的人,先检索非聚集索引的B+树查找到主键值14,然后根据主键值14继续在聚集索引B+树进行检索操作,最终到达叶子结点获取整行的数据。这个查找方式也叫书签查找。也就是说,非聚集索引存储索引列信息和对应的主键值,查找可能会有2次,在非聚集索引一次查找,在聚集索引一次查找。

        为什么说查找可能会有2次?其实还可能只有一次查找。不要慌,后面会继续讲解。

      补充说明
      1.如果一个主键被定义,该主键就是聚集索引(有的叫法可能叫聚簇索引、密集索引等)。
      2.若没有主键被定义,该表的第一个唯一非空索引则作为聚集索引。
      3.若不满足以上条件,innodb内部会生成一个隐藏主键(聚集索引),这个隐藏主键是一个自增长的6字节的列。

      4.回表与索引覆盖

      4.1 什么是回表查询?

        所谓的回表查询,就是非聚集索引先定位主键值,再到聚集索引定位行记录,它的性能较扫一遍索引树更低。

      4.2 什么是索引覆盖?

        explain查询sql执行计划时,Extra显示Using index时,能够触发索引覆盖。索引覆盖无需回表,需要查询的字段已经都在该索引树上了。索引已经“覆盖了”我们的查询需求,所以称为覆盖索引。

      4.3 非聚集索引一定会查询多次吗?查询非聚集索引后一定要到聚集索引再次查询吗?

        这也是面试问过的题目,答案是不一定!

        比如有一个联合索引idx_c2_c3(c2, c3),select c3 from 表名 where c2 = 4;就只需要查询一次辅助索引就可以了,因为我需要查询的值正好是索引之一,一棵索引树上就能获取SQL所需的列数据(索引覆盖),无需回表,速度更快。如下图,辅助索引的B+树就有条件筛选后我想要的c2、c3两个字段的数据。

        我看到的能够比较完美的能解释这个问题的是这张图

       

      博文看了这么多,终于理解了MySQL索引

        每条目录项(非叶子结点)记录都由c2、c3、页号这三个部分组成,各条记录先按照c2列的值进行排序,如果记录的c2列相同,则按照c3列的值进行排序。

        B+树叶子节点处的用户记录由c2、c3和主键c1列组成。

      注意:当你建立c2, c3联合索引之后却看到Extra显示Using index condition; Using filesort,一般是使用了where c2 = "xx" order by c3 desc这样的形式,有人认为Using filesort就是因为c3需要order by才导致外部排序,实际上是你联合索引顺序建反了,index(c2, c3)错误的写成了index(c3, c2),导致B+树优先按照c3排序,c3相同时,才按照c2排序,这样和写的sql意义不符合,具体可以和上图结合理解。

        你看看,你需要查找的数据字段和条件筛选的字段,在一颗B+树就可以完成,不需要回表。

        也千万要注意,联合索引时创建的仅仅是一个B+树,如果单独分开创建2个索引才是2个B+树。

        本篇是简洁版,想要看数据插入后内存如何变化,请见我下一篇:图文并茂说MySQL索引——入门进阶必备

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.51cto.com/u_14973569/6422542,作者:砖业洋__,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:MySQL中B+树索引的应用场景大全

      下一篇:MySQL中count是怎样执行的?———count(1),count(id),count(非索引列),count(二级索引列)的分析

      相关文章

      2025-05-14 10:33:16

      30天拿下Rust之向量

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

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

      30天拿下Rust之切片

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

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

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

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

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

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

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

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

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

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

      2025-05-14 10:02:48
      Index , 查找 , 索引
      2025-05-14 09:51:15

      mysql 语句如何优化

      MySQL语句的优化是一个复杂但重要的过程,因为它可以显著提高数据库的性能。

      2025-05-14 09:51:15
      JOIN , MySQL , 优化 , 使用 , 排序 , 查询 , 索引
      2025-05-13 09:50:59

      主键失效对该主键对应列上索引的影响

      主键失效对该主键对应列上索引的影响

      2025-05-13 09:50:59
      主键 , 失效 , 对应 , 索引
      2025-05-13 09:49:27

      mysql一些小知识点

      mysql 使用的是三值逻辑:TRUE FALSE UNKNOWN。

      2025-05-13 09:49:27
      left , mod , mysql , null , select , user
      2025-05-09 08:20:32

      MySQL——索引(概述和结构介绍)

      索引(index)是帮助 MySQL 高效获取数据的数据结构(是一种有序的数据结构)。

      2025-05-09 08:20:32
      Tree , 存储 , 引擎 , 数据结构 , 查询 , 索引 , 结构
      2025-05-08 09:04:49

      MySQL-备份+日志:介质故障与数据库恢复

      MySQL-备份+日志:介质故障与数据库恢复

      2025-05-08 09:04:49
      mysql , MySQL , 备份 , 恢复 , 数据库 , 文件 , 日志
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5255064

      查看更多

      最新文章

      30天拿下Rust之切片

      2025-05-14 10:33:16

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

      2025-05-14 10:03:13

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

      2025-05-14 10:03:13

      mysql 语句如何优化

      2025-05-14 09:51:15

      主键失效对该主键对应列上索引的影响

      2025-05-13 09:50:59

      mysql一些小知识点

      2025-05-13 09:49:27

      查看更多

      热门文章

      Windows下使用批处理实现启动关闭mysql

      2023-04-24 11:27:05

      cdh安装到scm-server的mysql报错处理

      2023-04-28 02:38:44

      Nacos数据持久化到MySQL

      2023-05-12 07:20:56

      python学习——使用MySQL

      2023-04-27 07:57:16

      MySQL的间隙锁

      2023-05-12 07:20:56

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

      2023-05-12 07:20:42

      查看更多

      热门标签

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

      相关产品

      弹性云主机

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

      天翼云电脑(公众版)

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

      对象存储

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

      云硬盘

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

      查看更多

      随机文章

      mariadb/mysql建立主从

      navicat连接MySQL8.0出现2059错误

      mysql的语法学习总结3(一些常见的问题)

      Mysql各个大版本之间的区别

      MySQL数据库中as和distinct关键字

      Mysql工具类:根据python dict字典类型数据到Mysql,并自动创建表与列

      • 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号