MySQL系列(11)--数据库索引

【知识图谱】neo4j安装与配置_社区版_2025(附完整安装软件包) (经历过各种版本NEO4J,遇见杂七杂八的各种问题,也看过非常多很好的教程,特此来分享一下,为大家排排坑。 阅读详情

索引简介

 
 B+树适合作为数据库的基础结构,完全是因为计算机的内存-机械硬盘两层存储结构。内存可以完成快速的随机访问(随机访问即给出任意一个地址,要求返回这个地址存储的数据)但是容量较小。而硬盘的随机访问要经过机械动作(1磁头移动 2盘片转动),访问效率比内存低几个数量级,但是硬盘容量较大。典型的数据库容量大大超过可用内存大小,这就决定了在B+树中检索一条数据很可能要借助几次磁盘IO操作来完成。如下图所示:通常向下读取一个节点的动作可能会是一次磁盘IO操作,不过非叶节点通常会在初始阶段载入内存以加快访问速度。同时为提高在节点间横向遍历速度,真实数据库中可能会将图中蓝色的CPU计算/内存读取优化成二叉搜索树(InnoDB中的page directory机制)。
 这里写图片描述
 真实数据库中的B+树应该是非常扁平的,可以通过向表中顺序插入足够数据的方式来验证InnoDB中的B+树到底有多扁平。我们通过如下图的CREATE语句建立一个只有简单字段的测试表,然后不断添加数据来填充这个表。通过下图的统计数据(来源见参考文献1)可以分析出几个直观的结论,这几个结论宏观的展现了数据库里B+树的尺度。

 1 每个叶子节点存储了468行数据,每个非叶子节点存储了大约1200个键值,这是一棵平衡的1200路搜索树!

 2 对于一个22.1G容量的表,也只需要高度为3的B+树就能存储了,这个容量大概能满足很多应用的需要了。如果把高度增大到4,则B+树的存储容量立刻增大到25.9T之巨!

 3 对于一个22.1G容量的表,B+树的高度是3,如果要把非叶节点全部加载到内存也只需要少于18.8M的内存(如何得出的这个结论?因为对于高度为2的树,1203个叶子节点也只需要18.8M空间,而22.1G从良表的高度是3,非叶节点1204个。同时我们假设叶子节点的尺寸是大于非叶节点的,因为叶子节点存储了行数据而非叶节点只有键和少量数据。),只使用如此少的内存就可以保证只需要一次磁盘IO操作就检索出所需的数据,效率是非常之高的。

这里写图片描述

Mysql的存储引擎和索引

当数据库一条记录里包含多个字段时,一棵B+树就只能存储主键,如果检索的是非主键字段,则主键索引失去作用,又变成顺序查找了。这时应该在第二个要检索的列上建立第二套索引。 这个索引由独立的B+树来组织。有两种常见的方法可以解决多个B+树访问同一套表数据的问题,一种叫做聚簇索引(clustered index ),一种叫做非聚簇索引(secondary index)。这两个名字虽然都叫做索引,但这并不是一种单独的索引类型,而是一种数据存储方式。对于聚簇索引存储来说,行数据和主键B+树存储在一起,辅助键B+树只存储辅助键和主键,主键和非主键B+树几乎是两种类型的树。对于非聚簇索引存储来说,主键B+树在叶子节点存储指向真正数据行的指针,而非主键。
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用”where id = 14”这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据
MyISM使用的是非聚簇索引(二级索引),非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。
聚簇索引和二级索引

看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过两次B+树查找,这不是多此一举吗?聚簇索引的优势在哪?

1 由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键Id来组织数据,获得数据更快。
2 辅助索引使用主键作为"指针" 而不是使用地址值作为指针的好处是,减少了当出现行移动或者数据页分裂时辅助索引的维护工作,使用主键值当作指针会让辅助索引占用更多的空间,换来的好处是InnoDB在移动行时无须更新辅助索引中的这个"指针"。也就是说行的位置(实现中通过16K的Page来定位,后面会涉及)会随着数据库里数据的修改而发生变化(前面的B+树节点分裂以及Page的分裂),使用聚簇索引就可以保证不管这个主键B+树的节点如何变化,辅助索引树都不受影响。
YOLOv8改进 | 主干网络 | 增加网络结构增强小目标检测能力【独家创新——附结构图】 YOLOv8改进,小目标检测,yolov8 阅读详情

相关推荐

(实战)[re:Invent 2018]-001:赛道分析-(致敬1024)

打印log

Rainbow 2780

Mysql的存储引擎和索引

 2 Mysql的存储引擎和索引   可以说数据库必须有索引,没有索引则检索过程变成了顺序查找,O(n)的时间复杂度几乎是不能忍受的。我们非常容易想象出一个只有单关键字组成的表如何使用B+树进行索引,只要将关键字存储到树的节点即可。当数据库一条记录里包含多个字段时,一棵B+树就只能存储主键,如果检索的是非主键字段,则主键索引失去作用,又变成顺序查找了。这时应该在第二个要检索的列上建立第二套索引。...

weixin_30471561的博客 213

UG二次开发避坑指南:如何正确配置Python环境让NXOpen脚本跑起来?

本文详细介绍了UG/NX二次开发中Python环境配置的全流程与NXOpen脚本调试技巧,帮助开发者避开常见陷阱。从NXOpen架构解析到Python解释器版本匹配,再到环境变量设置与路径问题处理,提供了一套经过验证的配置方案,确保脚本顺利运行。

weixin_33859135的博客 449

MySQL之数据存储索引篇(一)

索引的功能       建立索引的目的是加快对表中记录的查找或排序。付出的代价:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。常见的索引 类别 名称 数据结构 按照数据的连续性 聚簇索引 b+tree

当编程爱上艺术 6779

Vivado项目开发新思路:用VSCode写代码,用Vivado管理IP核与综合(Windows/Mac环境通用指南)

本文介绍了如何结合Vivado和VSCode的优势,打造高效的FPGA设计工作流。通过配置VSCode的Verilog插件和Vivado环境集成,开发者可以在VSCode中编写代码,同时利用Vivado管理IP核与综合,显著提升开发效率和团队协作体验。

weixin_42545503的博客 337

用Java实现森林冰火人游戏

g.drawString("游戏结束", CELL_SIZE * COLS / 2 - 100, CELL_SIZE * ROWS / 2);g.drawString("难度级别: " + difficultyLevel, 10, CELL_SIZE * ROWS + 60);g.drawString("生命值: " + playerHealth, 10, CELL_SIZE * ROWS + 20);setTitle("森林冰火人");

2401_82778412的博客 1734

Mysql索引的存储方式

非聚集索引:使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图 在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示: 第一个重大区别是InnoDB的数据文件本身就是索引文件。从

Janessa_的博客 3915

Unity中语法糖带来的GC问题 ——那些看起来优雅、实际上在背后偷偷生垃圾的代码

*语法糖(Syntactic Sugar)**指的是编程语言中为了让代码更简洁、易读而提供的简便写法。比如C#中的foreachlambda表达式LINQ自动属性等。语法糖本身不是坏事,但在Unity等对GC敏感的环境下,要警惕语法糖带来的隐式内存分配。合理使用语法糖,关键场合用更“丑陋”但高效的写法,才能保证游戏流畅运行。下面我将更深入地分析Unity中语法糖导致GC的原理、具体场景、检测与优化技巧,并补充一些容易忽视的细节。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 517

成大事数据库技术面试题系列05:MySQL索引深入面试题 | 第11-20题 | 从索引优化到性能分析,成为数据库专家

🔍 MySQL索引优化核心摘要 索引下推(ICP):MySQL 5.6+特性,将WHERE条件下推至存储引擎层过滤,减少回表次数,提高查询性能,通过EXPLAIN的"Using index condition"识别。 MySQL 8.0新特性: 不可见索引:用于测试索引删除影响,可随时切换可见性 降序索引:真正实现降序存储,优化ORDER BY DESC查询 函数索引:解决函数导致的索引失效问题,支持表达式索引 索引设计原则: ✅ 优先选择高区分度、查询频繁的列 ✅ 关注WHERE/O

成大事的博客 795

JavaSwing_4.2: JDialog、JOptionPane(对话框)

JDialog,对话框。使用 JDialog 类可以创建自定义有的对话框,或者调用 JOptionPane 中的多个静态方法快速创建各种标准的对话框。JOptionPane是 JavaSwing 内部已实现好的,以静态方法的形式提供调用,能够快速方便的弹出要求用户提供值或向其发出通知的标准对话框。

谢TS的博客 7万+

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

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

MySQL高级篇——索引失效的11种情况

索引优化思路、要尽量满足全值匹配、最佳左前缀法则、主键插入顺序尽量自增、计算、函数导致索引失效、类型转换(手动或自动)导致索引失效、范围条件右边的列索引失效、不等于符号导致索引失效、is not null、not like无法使用索引、左模糊查询导致索引失效、“OR”前后存在非索引列,导致索引失效、不同字符集导致索引失败,建议utf8mb4

种一棵树最好的时间是十年前,其次是现在 3万+

基于STM32F103的智能门禁门锁门卫系统设计

本文设计了一种基于STM32F103单片机的智能门禁系统,集成了密码、射频IC卡和指纹识别三种验证方式。系统采用模块化设计,包含MFRC522射频模块、AS608指纹模块、矩阵键盘、OLED显示和舵机控制等硬件,实现了身份验证、密码修改、IC卡/指纹管理以及安全防护功能。测试结果表明系统响应迅速(密码验证250ms、指纹验证600ms)、功耗低(待机50mA),且具备掉电密码保存功能。该系统操作简便、功能完善,适用于家庭和办公场所,具有较高实用价值。未来可扩展远程控制、人脸识别等功能以进一步提升智能化水平。

3254968421的博客 319

MySQL系列11——索引效率测试

MySQL索引效率测试 一、以mysql添加索引和不添加索引为例,测试数据的插入速度和查询速度。 1、首先创建数据表和数据库,在cmd命令行中执行: create database TestDataSpeed charset=utf8; use testdataspeed; create table DataNoIndex(id int,name char(10),age int,address char(20),gender char(1)); #创建不带索引的数据表 create table DataN

qq_42486675的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

【mysql】带你玩转mysql数据库中的索引

innodb和myisam的索引的存储方式是不同的: - innodb 存储引擎 索引和数据都存在ibd文件中。 - myisam 把所有的索引全部单独存储,就是那个MYI文件。 索引的数据结构使用的是b+树: - 一个叶子节点也叫一个数据页,可以存多条数据,大概16k。 - 单条数据量越小,叶子节点存的数据量就会越大,需要的叶子节点就越少,这样的话,树的高度相对降低一些,查询的速度越快.

景天科技苑 7419

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MySQL索引系列:全文索引

什么是全文索引? 全文索引首先是 MySQL 的一种索引类型,也是搜索引擎的关键技术。 试想在1M大小的文件中搜索一个词,可能需要几秒,在100M的文件中可能需要几十秒,如果在更大的文件中搜索那么就需要更大的系统开销,这样的开销是不现实的。 所以在这样的矛盾下出现了全文索引技术,有时候有人叫倒排文档技术。 全文索引的作用是什么? 全文索引是将存储在数据库中的大段文本中的任意内容信息查找出来的技术。 既然是查找包含某些内容的文本,用 like + 通配符 或者正则表达式就可以实现模糊匹配,为什么还要全文索引?

@日月空@的博客 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL数据库之索引

因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。需要满足最左原则,因为select 语句的where条件是依次从左往右执行的,所以在使用select 语句查询时where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。唯一索引:与普通索引类似,但区别是唯一索引列的每个值都唯一。组合索引(单列索引与多列索引):可以是单列上创建的索引,也可以是在多列上创建的索引。创建唯一键或者创建唯一索引都可实现。

GaLiCHaoFan1的博客 5198

面试中,MySQL 索引系列相关问题详解

面试中,MySQL 索引系列相关问题详解 文章目录面试中,MySQL 索引系列相关问题详解什么是索引?索引的分类按数据结构分类通过主键查询商品数据的过程通过二级索引查询商品数据的过程为什么 MySQL InnoDB 选择 B+tree 作为索引的数据结构?按物理存储分类按字段特性分类主键索引唯一索引普通索引前缀索引按字段个数分类联合索引什么时候需要 / 不需要创建索引?什么时候适用索引?什么时候不需要创建索引?有什么优化索引的方法?前缀索引优化覆盖索引优化主键索引最好是自增的防止索引失效总结结语 面试中,

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 6334

【MySQL系列】abc索引分析

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2万+

【MySQL 进阶之路】索引失效的11种情况

在MySQL的查询优化中,索引是一项至关重要的技术,它能够大大提升数据检索的效率。本文将讨论这11种常见情况,帮助开发者更好地理解索引的使用及优化。

ajsbxi的博客 3228

如何使用SQL系列 之 如何在MySQL中使用索引

数据库能够接受各种各样的查询条件,这使得数据库引擎很难预测哪些查询是最常见的。引擎必须准备好在数据库表中有效地定位行,而不管行大小如何。然而,随着数据量的增加,搜索性能可能会受到影响。数据集越大,数据库引擎就越难快速找到与查询匹配的文档。 数据库管理员可以使用数据库索引来辅助数据库引擎,提高其性能。 在本教程中,您将了解什么是索引,如何创建索引,以及是否用于查询数据库。

码觉客的博客 1万+

MySQL适合创建索引的11种情况

在MySQL中,索引是优化数据库查询性能的重要工具。合理创建索引可以显著提升查询效率,但不当的索引设计可能会导致性能下降或资源浪费。

zhangxueyi的专栏 1675

DB - 初识数据库索引

数据库索引1 索引概述2 索引的优点与缺点3 索引结构4 索引分类5 使用索引5.1 创建索引5.2 查看索引5.3 删除索引5.4 ALTER命令6 索引设计原则 1 索引概述 MySQL官方对索引的定义:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在保存数据的同时,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 通过以下示意图理解索引: 左边是数据表,一共有两列七条记录,最

xing123456jl的博客 740

MySQL数据库的索引

可以是单列上创建的索引,也可以是在多列上创建的索引。需要满足最左原则,因为select 语句的where条件是依次从左往右执行的,所以在使用select 语句查询时where 条件使用的字段顺序必须和组合索引中的排序一致,否则索引将不会生效。因为索引本身会消耗系统资源,在有索引的情况下,数据库会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担。与普通索引类似,但区别是唯一索引列的每个值都唯一。一个表只能有一个主键,不允许有空值。除了删除主键索引,删除其他索引的方式是一样的。

gfbcdgbb的博客 1761

Mysql数据库索引_mysql 在数据库索引 还是自建索引表

create table 表名(列名1 数据类型 ,列名2 数据类型,列名3 数据类型,index index_索引名字 (列名1,列名2,列名3));设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询的速度,这是创建索引的最主要的原因。唯一索引允许有空值,如果是用组合索引创建,则列值 的组合必须唯一,添加唯一键将自动创建唯一索引。当表很大或查询涉及多个表的时候,使用索引可以成千上万的提高查询速度。与普通索引类似,区别是,唯一索引的每个值都是唯一。#创建一个表,定义字段和组合索引。

2501_90404020的博客 985

mysql索引总结_mysql 索引类型以及创建

文章归属:http://feiyan.info/16.html  自己还是小白,从借鉴别人的东西开始学习。     关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢。还

杨帅的博客 1万+
上一篇: MySQL系列(10)--数据库树形结构基础
下一篇: MySQL系列(12)--数据库索引page实现
duanxiaobin_SA
博客等级 码龄9年 14粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值