MySQL索引的原理

MySQL(二)MySQL索引原理 全表扫描:explain分析type属性all全索引扫描:explain分析type属性index索引过滤性不好:靠索引字段选型、数据量和状态、表设计频繁的回表查询开销:尽量少用select *,使用覆盖索引。 阅读详情

引言

回想四年前,我在学习mysql的索引这块的时候,老师在讲索引的时候,是像下面这么说的

索引就像一本书的目录。而当用户通过索引查找数据时,就好比用户通过目录查询某章节的某个知识点。这样就帮助用户有效地提高了查找速度。所以,使用索引可以有效地提高数据库系统的整体性能。

嗯,这么说其实也对。但是呢,大家看完这种说法,其实可能还是觉得太抽象了!因此呢,我还想再深入的细说一下,所以就有了此文!
需要说明的是,我说的内容只在Mysql的Innodb引擎中是成立的。在Sql Server、oracle、Mysql的Mysiam引擎中的正确性,不一定成立!
OK,废话不多说,开始啰嗦!

正文

索引的科普

先引进聚簇索引和非聚簇索引的概念! 
我们平时在使用的Mysql中,使用下述语句

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
    [USING index_type]
    ON tbl_name (index_col_name,...)

index_col_name:
    col_name [(length)] [ASC | DESC]

创建的索引,如复合索引、前缀索引、唯一索引,都是属于非聚簇索引,在有的书籍中,又将其称为辅助索引(secondary index)。在后文中,我们称其为非聚簇索引,其数据结构为B+树。

那么,这个聚簇索引,在Mysql中是没有语句来另外生成的。在Innodb中,Mysql中的数据是按照主键的顺序来存放的。那么聚簇索引就是按照每张表的主键来构造一颗B+树,叶子节点存放的就是整张表的行数据。由于表里的数据只能按照一颗B+树排序,因此一张表只能有一个聚簇索引。

在Innodb中,聚簇索引默认就是主键索引。
这个时候,机智的读者,应该要问我

如果我的表没建主键呢?

回答是,如果没有主键,则按照下列规则来建聚簇索引

  • 没有主键时,会用一个唯一且不为空的索引列做为主键,成为此表的聚簇索引

  • 如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

ps:大家还记得,自增主键和uuid作为主键的区别么?由于主键使用了聚簇索引,如果主键是自增id,,那么对应的数据一定也是相邻地存放在磁盘上的,写入性能比较高。如果是uuid的形式,频繁的插入会使innodb频繁地移动磁盘块,写入性能就比较低了。

索引原理介绍

先来一张带主键的表,如下所示,pId是主键

接下来,我们画出该表的结构图如下

如上图所示,分为上下两个部分,上半部分是由主键形成的B+树,下半部分就是磁盘上真实的数据!那么,当我们, 执行下面的语句

select * from table where pId='11'

那么,执行过程如下


如上图所示,从根开始,经过3次查找,就可以找到真实数据。如果不使用索引,那就要在磁盘上,进行逐行扫描,直到找到数据位置。显然,使用索引速度会快。但是在写入数据的时候,需要维护这颗B+树的结构,因此写入性能会下降!
OK,接下来引入非聚簇索引!我们执行下面的语句

create index index_name on table(name);

此时结构图如下所示


大家注意看,会根据你的索引字段生成一颗新的B+树。因此, 我们每加一个索引,就会增加表的体积, 占用磁盘存储空间。然而,注意看叶子节点,非聚簇索引的叶子节点并不是真实数据,它的叶子节点依然是索引节点,存放的是该索引字段的值以及对应的主键索引(聚簇索引)。
如果我们执行下列语句

select * from table where name='lisi'

此时结构图如下所示


通过上图红线可以看出,先从非聚簇索引树开始查找,然后找到聚簇索引后。根据聚簇索引,在聚簇索引的B+树上,找到完整的数据!

那什么情况不去聚簇索引树上查询呢?

还记得我们的非聚簇索引树上存着该索引字段的值么。如果,此时我们执行下面的语句

select name from table where name='lisi'

此时结构图如下


如上图红线所示,如果在非聚簇索引树上找到了想要的值,就不会去聚簇索引树上查询。还记得,博主在《select的正确姿势》提到的索引问题么:

当执行select col from table where col = ?,col上有索引的时候,效率比执行select * from table where col = ? 速度快好几倍!

看完上面的图,你应该对这句话有更深层的理解了。

那么这个时候,我们执行了下述语句,又会发生什么呢?

create index index_birthday on table(birthday);

此时结构图如下


看到了么,多加一个索引,就会多生成一颗非聚簇索引树。因此,很多文章才说,索引不能乱加。因为,有几个索引,就有几颗非聚簇索引树!你在做插入操作的时候,需要同时维护这几颗树的变化!因此,如果索引太多,插入性能就会下降!

总结

讲到这里,大家应该清楚的明白索引的原理了!可能细节方面还不够严谨,但是我觉得一个研发,理解到这里可以了,够用了,毕竟我们也不是专业的DBA。
希望大家有所收获!

【AI智能体】Dify 搭建发票识别助手操作实战详解 Dify 搭建发票识别专属助手操作实战详解 阅读详情

相关推荐

lego-loam featureAssociation 源码注释(五)

上一次我们已经看完了特征提取,这次我们进入特征匹配的内容!!!systemInitedLM的初始值为false。

Joeybee的博客 889

MySQL: InnoDB 还是 MyISAM?

MyISAM存储引擎 MyISAM是 默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。MyISAM存储引擎的一些特征: · 所有数据值先存储低字节。这使得数据机和操作系统分离。二进制轻便性的唯一要求是机器使用补码(如最近20年的机器有的一样)和IEEE浮点格式(在主流机器中也完全是主导的)。唯一不支持二进...

weixin_30279315的博客 335

零中频接收机实战:DC Offset的5种常见解决方案与调试技巧

本文针对零中频接收机中DC Offset这一核心挑战,深入剖析了其产生机理与对信号解调的严重影响。文章从实战角度出发,系统性地介绍了五种解决方案,包括硬件预防、数字域校正、I/Q不平衡联合校正等,并分享了关键的实验室调试与产线测试技巧,旨在帮助射频工程师有效提升接收机性能。

weixin_29234509的博客 399

MySQL 索引原理

MySQL索引深入剖析

杨宇昌的博客 1万+

opencv基础57-模板匹配cv2.matchTemplate()->(目标检测、图像识别、特征提取)

OpenCV 提供了模板匹配(Template Matching)的功能,它允许你在图像中寻找特定模板(小图像)在目标图像中的匹配位置。模板匹配在计算机视觉中用于目标检测、图像识别、特征提取等领域。: 首先,加载目标图像和要匹配的模板图像。: 选择适当的匹配方法,例如 cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_SQDIFF 或 cv2.TM_SQDIFF_NORMED。每种方法对应不同的匹配计算方式。

小海聊智造 1万+

SAP S/4HANA Public Cloud 配置全景实践

本文提供SAP S/4HANA Public Cloud配置的实用指南,重点介绍三大核心工具:CBC(范围界定与配置)、SAP Activate(方法论与路线图)和Cloud ALM(项目执行与运维)。文章详解了不同系统架构(2SL/3SL)的配置路径,并以制造企业案例说明端到端实施流程。同时提供了工具协同操作方法、初始访问安全建议和常见问题的专家意见,帮助项目团队高效完成实施工作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 560

【原创】MySQL(Innodb)索引的原理

引言 回想四年前,我在学习mysql的索引这块的时候,老师在讲索引的时候,是像下面这么说的 索引就像一本书的目录。而当用户通过索引查找数据时,就好比用户通过目录查询某章节的某个知识点。这样就帮助用户有效地提高了查找速度。所以,使用索引可以有效地提高数据库系统的整体性能。 嗯,这么说其实也对。但是呢,大家看完这种说法,其实可能还是觉得太抽象了!因此呢,我还想再深入的细说一下,所以就有了此文! 需...

weixin_30858241的博客 204

1.4 你绝对不能错过的天气查询工具:MCP 标准化接入实战

本文介绍了如何构建一个符合MCP标准的天气查询服务。通过FastMCP框架集成OpenWeatherMap API,实现实时天气、天气预报和历史天气查询功能。文章详细展示了从环境准备、插件设计到控制器实现的完整流程,包括如何定义工具函数、配置路由和中间件。同时讲解了如何将MCP服务封装为LangChain工具并与DeepSeek等大模型集成,还涵盖了缓存、限流等高级特性。该示例演示了如何将任意API标准化为MCP服务,为Agent应用提供统一接口。

yonggeit的博客 3047

MySQL 索引原理详解

InnoDB中的B+Tree,Mysql索引

记录,交流,共同进步 3008

【Qt】解决 FTH: (11284): *** Fault tolerant heap shim applied to current process. (亲测有效)

计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers。容错堆垫片应用到当前的过程。这通常是由于以前的崩溃。win + r,输入regedit。

Fanjufei的博客 830

WblockCloneObjects克隆一个图纸内的实体包括块参照,同名块参照的处理

public static void HeBingTu2(double lieJu, List<string> filePaths) { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; using (DocumentLock docLock = doc.Lock...

1108

mysql索引原理

mysql索引原理 首先介绍一款可以帮助理解数据结构的网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 一、数据结构 索引是一种特殊的数据结构。可以帮助我们快速查询到数据。 (1)二叉树 二叉树是一种特殊的树,每个节点最多有两个子节点,值从左到右依次递增。 例如:当想查询值为11的数据时,如果没有索引要按顺序查找多次,有索引只查三次,加速了查询数据。 问:为什么索引的数据结构不用二叉树? 因为当值依次递

sumengnan的博客 8692

亚马逊跨境电商选品数据分析:Python爬虫实战指南

本文将带领大家构建一套完整的亚马逊选品数据采集与分析系统,使用最新的Python技术栈,从零开始爬取亚马逊商品数据,并进行深度分析。

2201_76125261的博客 299

MYSQL索引底层原理

MYSQL索引底层原理

winy1986的博客 3863

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【MySQL】索引原理及操作

如果可以,则该列为1。至此,我们引入页目录以后,单个page内的数据查找效率已经得到了极大的提高,但MySQL可不仅仅只有一个page,我们只解决了page内部的数据查找问题,但一个数据在哪个page仍旧需要线性遍历的方式查找,而只要线性遍历,那么带来的就是效率问题,那么我们一定要对查找page的遍历方式进行优化!注意:尽管越靠近外侧,扇区的物理面积好像越大,但不管它多大,在数据存储方面始终都是只能存储512字节的数据,尽管在最新的磁盘技术中,为了更大的容量,外侧的扇区能存储的数据越多,但我们暂时不考虑!

m0_73904148的博客 1448

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Mysql索引原理

Mysql索引原理 1、索引原理 MySQL官方对索引定义:是存储引擎用于快速查找记录的一种数据结构。需要额外开辟空间和数据维护工作。 索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,包含着对数据表里所有记录的引用指针,它是要占据物理空间的。 索引可以加快检索速度,但是同时也会降低增删改操作速度,索引维护需要代价。 索引涉及的理论知识:二分查找法、Hash和B+Tree。 优点 加快数据的检索速度; 通过使用索引,可以在查询的过程中,提高系统的性能; 缺点 创

一名蒟蒻的博客 3012

【MySQL】索引原理

磁盘结构、索引原理以及索引操作。

在平淡的日子里寻找存在的价值 734

MySQL索引原理

MySQL索引的原理 一、索引原理 索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:先定位到章,然后定位到盖章的下一个小节,然后找到页数。相似的例子还有:查字典,查火车车次,飞机航班等 本质来讲:就是通过不断地缩小想要获取数据的数据范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。 数据库也是一样,但显然...

qq_40883945的博客 572

MySQL03 - 索引之索引原理

MySQL03 - 索引之索引原理

qq_43350524的博客 1308

mysql索引底层原理

理解MySQL索引的底层原理对于数据库性能优化至关重要。通过选择合适的索引类型、优化索引结构和利用覆盖索引等技术,可以显著提高查询效率和数据库的整体性能。在实践中,定期分析和优化索引策略是维护高性能数据库的关键步骤之一。

sun007700的专栏 546

MySQL索引深入解析:从原理到实践

索引是数据库表中一列或多列的值进行排序的一种数据结构,使用索引可以快速访问数据库表中的特定信息。简单来说,索引就像是书籍的目录,能够帮助我们快速定位到需要的内容,而不必逐页翻阅。索引是MySQL性能优化的核心,合理使用索引可以提升查询性能几个数量级。但索引并非越多越好,需要根据实际查询模式、数据分布和写负载来精心设计。理解索引的底层原理有助于做出更好的设计决策,避免常见的性能陷阱。记住,索引设计是一门艺术,需要在查询性能与写开销之间找到平衡点。

weixin_51786043的博客 2831

MySQL的索引原理及使用

B+树、B-树、哈希、Mysql的索引、硬盘IO原理、索引优化、Mysql的索引使用、组合索引的使用原则,最左原则

糖拌西红柿 1540

MySQL索引原理之实现原理

MySQL索引的实现机制

丿涛哥哥的博客 913

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

转自:http://benjaminwhx.com/2018/02/26/MySQL%E7%B4%A2%E5%BC%95%E5%8E%9F%E7%90%86%E4%BB%A5%E5%8F%8A%E6%85%A2%E6%9F%A5%E8%AF%A2%E4%BC%98%E5%8C%96/ 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存...

神韵 901
上一篇: 海外手机号码格式校验(PHP版)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值