MS SQL 索引(二)

【mysql】聚簇索引和非聚簇索引(B树和B+树) B+树,作为B树的升级版,在B树基础上,MySQL在B树的基础上继续改造,使用B+树构建索引。B+树和B树最主要的区别在于非叶子节点是否存储数据的问题​聚集索引:指索引项的排序方式和表中数据记录排序方式一致的索引。聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。 每个InnoDB表都有一个聚簇索引 ,聚簇索引使用B+树构建,叶子节点存储的数据是整行记录。一般情况下,聚簇索引等同于主键索引,当一个表没有创建主键索引时,InnoDB会自动创建一个ROWID字段来构建聚簇索引。 阅读详情

(一)索引结构:

    表(Tables)中数据实际上都存储在页(pages)里,除了BLOB类型的数据。如果某列的字段的类型为BLOB那么将有一个16字节的指针指向BLOB page。页是MS SQL Server中数据存储的最小单位。每页包含以行(row)为单位保存数据。一行只能存储在一个页中。每页可以容纳8KB的信息。因为这个原因,每行的最大值为8KB。一组相邻的8个页被称为一个盘区(Extent)
   堆文件和分配映射索引(Heap and the Index Allocation Map(IAM))

    堆文件在sysindexs表中只有一行记录,并且其indid = 0. sysindexs.FIRSTIAM字段指向了IAM页链表中一个IAM页,IAM页是用来管理SQL Server已经给堆文件分配的空间。MS SQL Server2000用IAM(Index Allocation Map)页来在堆文件中导航(navigate)。在堆文件中,数据页(data page)和数据页中数据没有按照特定的顺序存储,也没有链接在一起。数据页之间唯一的逻辑链接是通过IAM页中记录来实现的。

    所有的SQL Server 索引都是 B-Trees。在这种树的顶端有一个根页(root page),通过root page来访问N个中级(intermediate level)页,直到树的底部、或叶级(leaf level)。可以通过树中每个节点的指针从上向下扫描整个索引树。另外,每个索引级(index leves)(可能是intermediate leve or leaf level)都有一个页链(page chain)。在一个索引中有许多intermediate level。索引树的级数(树的高度)与索引码的宽度、索引类型、记录行数和表中的页数有关,并且索引树的级数是影响索引性能的一个重要参数。
    如果当前的表是以聚集索引方式存储,那么非聚集索引的位置信息就是聚集索引的索引码(index key);否则,位置信息就是row ID(RID),每个RID由file number、page number和 slot number of row(每行记录的槽号)。比如,要在一个表中检索某个employee ID(emp_id),该表已经有在emp_id列上创建了非聚集索引,SQL Server查找索引树,找到一个索引条目包含你需要查找的emp_id,然后利用其中RID来访问到对应数据页中的值。

     在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。

不过这个定义太抽象了。在SQL Server中,索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。如下图:

聚集索引非聚集索引

之前的BLOG里的文章MS SQL 索引(一)也介绍了SQL server的基本概念。

 

(二)索引块与数据块的区别

     索引可以提高检索效率,因为它的二叉树结构以及占用空间小,所以访问速度块。让我们来算一道数学题:如果表中的一条记录在磁盘上占用1000字节的话,我们对其中10字节的一个字段建立索引,那么该记录对应的索引块的大小只有10字节。我们知道,SQL Server的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间,那么这一个页可以存储上述记录8条,但可以存储索引800条。现在我们要从一个有8000条记录的表中检索符合某个条件的记录,如果没有索引的话,我们可能需要遍历8000条×1000字节/8K字节=1000个页面才能够找到结果。如果在检索字段上有上述索引的话,那么我们可以在8000条×10字节/8K字节=10个页面中就检索到满足条件的索引块,然后根据索引块上的指针逐一找到结果数据块,这样IO访问量要少的多。


(三)索引优化技术

    是不是有索引就一定检索的快呢?答案是否。有些时候用索引还不如不用索引快。比如说我们要检索上述表中的所有记录,如果不用索引,需要访问8000条×1000字节/8K字节=1000个页面,如果使用索引的话,首先检索索引,访问8000条×10字节/8K字节=10个页面得到索引检索结果,再根据索引检索结果去对应数据页面,由于是检索所有数据,所以需要再访问8000条×1000字节/8K字节=1000个页面将全部数据读取出来,一共访问了1010个页面,这显然不如不用索引快。

SQL Server内部有一套完整的数据检索优化技术,在上述情况下,SQL Server的查询计划(Search Plan)会自动使用表扫描的方式检索数据而不会使用任何索引。那么SQL Server是怎么知道什么时候用索引,什么时候不用索引的呢?SQL Server除了日常维护数据信息外,还维护着数据统计信息,下图是数据库属性页面的一个截图:(原图为SQL SERVER2000的图)

索引统计

 

 

(四)聚簇索引与非聚簇索引的本质区别

       现在可以讨论聚簇索引与非聚簇索引的本质区别了。正如本文最前面的两个图所示,聚簇索引的叶节点就是数据节点,而非聚簇索引的页节点仍然是索引检点,并保留一个链接指向对应数据块。

还是通过一道数学题来看看它们的区别吧:假设有一8000条记录的表,表中每条记录在磁盘上占用1000字节,如果在一个10字节长的字段上建立非聚簇索引主键,需要二叉树节点16000个(这16000个节点中有8000个叶节点,每个页节点都指向一个数据记录),这样数据将占用8000条×1000字节/8K字节=1000个页面;索引将占用16000个节点×10字节/8K字节=20个页面,共计1020个页面。

同样一张表,如果我们在对应字段上建立聚簇索引主键,由于聚簇索引的页节点就是数据节点,所以索引节点仅有8000个,占用10个页面,数据仍然占有1000个页面。

下面我们看看在执行插入操作时,非聚簇索引的主键为什么比聚簇索引主键要快。主键约束要求主键不能出现重复,那么SQL Server是怎么知道不出现重复的呢?唯一的方法就是检索。对于非聚簇索引,只需要检索20个页面中的16000个节点就知道是否有重复,因为所有主键键值在这16000个索引节点中都包含了。但对于聚簇索引,索引节点仅仅包含了8000个中间节点,至于会不会出现重复必须检索另外1000个页数据节点才知道,那么相当于检索10+1000=1010个页面才知道是否有重复。所以聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。

让我们再来看看数据检索的效率,如果对上述两表进行检索,在使用索引的情况下(有些时候SQL Server执行计划会选择不使用索引,不过我们这里姑且假设一定使用索引),对于聚簇索引检索,我们可能会访问10个索引页面外加1000个数据页面得到结果(实际情况要比这个好),而对于非聚簇索引,系统会从20个页面中找到符合条件的节点,再映射到1000个数据页面上(这也是最糟糕的情况),比较一下,一个访问了1010个页面而另一个访问了1020个页面,可见检索效率差异并不是很大。所以不管非聚簇索引也好还是聚簇索引也好,都适合排序,聚簇索引仅仅比非聚簇索引快一点。

 

 

 

聚簇索引 vs 非聚簇索引:一文讲透核心原理与区别 聚簇索引(Clustered Index)是一种数据和索引“绑在一起”的结构聚簇索引的叶子节点存储的就是完整的行数据本身!所以在 InnoDB 中,主键索引(PRIMARY KEY)就是聚簇索引。非聚簇索引(Secondary Index)叶子节点并不直接存储数据行,而是存储主键值(row id)。也就是说:查找时你要先查二级索引 → 再通过主键回表去聚簇索引查真正数据。这个过程叫做回表查询。特性聚簇索引(主键)非聚簇索引(二级索引)是否保存整行数据✅ 是❌ 否(只存主键)是否按顺序排列。 阅读详情

相关推荐

一条慢SQL的救赎之路:从3秒到30ms的优化实战

摘要:本文通过一个电商系统商品列表页慢查询的案例,详细分析了SQL性能优化的完整过程。DBA通过EXPLAIN分析发现全表扫描问题,建立符合最左前缀原则的联合索引,使用覆盖索引避免回表,改写深度分页SQL实现延迟关联,并调整InnoDB缓冲池配置。最终将查询时间从3.2秒优化到28ms,性能提升15倍。文章强调了持续监控的重要性,提供了慢查询分析工具链(EXPLAIN、pt-query-digest),展示了从索引设计到存储引擎调优的全方位优化思路。

Pengyh的博客 1421

MYSQL性能调优: 对聚簇索引和非聚簇索引的认识

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法。特点是存储数据的顺序和索引顺序一致。一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引。在《数据库原理》一书中是这么解释聚簇索引和非聚簇索引的区别的:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。因此,MYSQL中不同的数据存储引擎对聚簇索引的支持不同就很好解...

chuixue24的博客 1260

MS SQL管理器

insert into [dbo.Bookinfo] (bookname ,Author ,Price ) values (N'第六本书',N'江生',78)其功能是将新元组插入指定表中,其中新元组的属性列1的值为常量1,属性列2的值为常量2,…·数据控制语言,即SQLDCL,这一部分包括对基本表和视图的授权、完整性规则的描述、事务控制等内容。nvarchar: 可变长度(中文),存储Unicode字符,根据数据长度自动变化。数据定义语言,即SQL DDL,用于定义SQL模式、基本表、视图、索引等结构。

c479004697的博客 718

聚簇索引 和 非聚簇索引详解

聚簇索引、非聚簇索引、InnoDB

weixin_44991038的博客 1万+

【聚簇索引和非聚簇索引有什么区别?】

【聚簇索引和非聚簇索引有什么区别?】

学无止境 2834

android OTA升级之后,apk崩溃无法启动

也就是说,我们这个高低版本是fingerprint相同的情况,这个问题追述到jenkins编译,启动job时会初始化一个BUILD_NUMBER值,这个值正好跟Android的build系统的名称重复,这就导致Android build系统那一套拼接时间戳的值不会走,因为jenkins一启动就会定义该值,而我们jenkins服务器迁移过,这个值又会从1开始累计,导致前后版本都是16,从而导致fingerprint一致。问题背景:系统版本从低版本升级到高版本后,apk崩溃启动失败。硬件平台:QCS6125。

kevin's cache的专栏 1346

SQL优化案例分享

某国产数据库原厂高级工程师找我优化SQL,以下是他给的三个案例。****😼慢SQL和执行计划 他将 enable_nestloop 关闭以后强行hash,速度快了不少,但是需要使用hint干预计划。 这种简单的语句我大概看了2秒种,给出改写方案,不带思考的。 慢SQL和执行计划 这条SQL我也是简单喵了一眼,让原厂高级工程师加个索引 t1 表对 staff_id,shift_id 两个列加个索引,但是他对我的建议表示怀疑。😂 毕竟人家是原厂工程师,对他们家的产品更加专业,更加权威,专业性这块是毋庸

数记 462

AI内容安全机制解析:从破甲现象看模型防护与合规边界

AI内容安全机制是保障人工智能模型合规应用的核心技术,其原理基于多层防护体系。通过意图识别、关键词过滤和多模态检测等技术,系统能够实时监控用户输入和模型输出,有效拦截违规内容。这种机制的技术价值在于平衡模型创造力与内容安全性,确保AI生成内容符合伦理规范。在应用场景上,内容安全机制广泛应用于聊天机器人、内容创作平台和企业级AI系统,防止色情、暴力等有害信息的传播。随着破甲等绕过手法的出现,安全机制需要持续进化以应对指令混淆、上下文污染等新型挑战。本文从技术攻防角度深入分析AI内容安全的实现原理与发展趋势,为

1081

慢SQL优化笔记:从3041ms到10ms的优化之旅

本文主要记录了项目上一次慢SQL优化的过程。通过业务逻辑代码优化、合理的索引设计、连接方式优化、查询条件优化等手段来进行SQL优化,提高系统性能。

专注Java和MySQL领域知识分享 1984

DoDAF2.0与UAF1.0与UPDM与IBD与Rhapsody与MagicDraw与SysML

参考:fr=ge_alafr=ge_ala。

计算机辅助工程 1417

Windows 11安装realtek audio control

Windows 11安装realtek audio control,解决无法链接RPC问题

m0_46144825的博客 8万+

STLG_02_01_MS SQL - SQL和MS SQL Server概要

MS SQL Server和SQL概要介绍

cdlislxjt的博客 1243

华为OD机试双机位C卷-几何平均值最大子数组(Py/Java/C/C++/Js/Go)

华为OD机试(机考)2026双机位C卷 【几何平均值最大子数组】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【几何平均值最大子数组】。

qq_45776114的博客 1367

如何在 MS SQL 中重新组织和重建索引?

它们采用高级算法设计,可从损坏的数据库中恢复所有对象,包括聚集和非聚集索引、存储过程、触发器等。要解决与索引中的损坏相关的错误,或者当索引的碎片级别增加时,您可以重新生成或重新组织索引。我们还将提到一个高级 MS SQL 数据库修复工具,它可以快速、完全精确地从损坏的 SQL 数据库文件中恢复索引和其他对象。在重新组织索引之前,您需要知道碎片的百分比。展开 Indexes 文件夹,右键单击需要重新生成的索引,然后选择 Rebuild。在 SSMS 的对象资源管理器中,展开包含需要重新生成索引的表的数据库。

免费 938

LPDDR6 tdbR2dbR_L cross row技术探讨

LPDDR6 tdbR2dbR_L cross row技术探讨

zilan23的博客 47

撸毛笔记-朴朴超市 v1.01

朴朴超市 v1.01脚本地址:自动签到和组队赚朴分, 朴分可以抵扣50%的金额组队瓜分需要4人成团, 每个号每天只能开团和入队各一次每天跑一两次即可使用扫码或自己想办法捉refreshToken扫码获取token: (先微信进入朴朴超市小程序并登录注册过账号再扫码)把获取的refreshToken和备注(非必须)填到文件pupuCookie.txt里(第一次运行会自动创建), 多账号换行或&或@隔开。

xiaoshun007的专栏 1805

MS SQL Server数据库原理

MS SQL Server数据库原理 一、 数据库基本概念 数据库系统(DBS):采用数据库技术的计算机系统,由数据库(数据)、数据库管理系统(软件)、数据库管理员(人员)、硬件平台(硬件)和软件平台(软件)五部分构成的运行实体。 数据库管理系统:位于用户与操作之间的一层数据管理软件。 关系数据库:支持关系模型的数据库。关系模型有数据结构(二维表)、关系操作集合(关系代数、关系演算、二者结合特点...

qq_43707810的博客 3522

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MS SQL整理索引碎片

有时候会遇到这样一种情况,数据库效率优化过程中,已经创建了索引,并且所有索引都在工作,但性能却仍然不好,那很可能是产生了索引碎片,你需要进行索引碎片整理。 索引碎片产生的原因是:由于表上有过度地插入、修改和删除操作,索引页被分成多块就形成了索引碎片,如果索引碎片严重,那扫描索引的时间就会变长,甚至导致索引不可用,因此数据检索操作就慢下来了。 索引碎片分为内部碎片和外部碎片。 内部碎片:为了有

BohemianLife的专栏 1202

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MS-SQL创建查询排序语句总结

WHERE 子句中定义的搜索条件可以是简单的单值比较条件,也可以使用各种运算符、组合子句条件。

par@ish的博客 1908

WINCC7.3破解文件

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

【Mysql】索引优化实战:从 320ms 到 130ms 的慢 SQL 改造

执行计划分析核心:重点关注 type(扫描方式)、key(索引是否生效)、rows(扫描行数)、Extra(临时表 / 排序 / 索引下推),这 4 个字段能快速定位瓶颈;复合索引设计原则:「过滤性优先→JOIN 字段→排序字段→查询字段」,遵循最左前缀匹配,避免范围条件后置;索引失效高频场景:函数操作、隐式转换、范围条件后的字段复用、模糊查询(% 开头)、OR 条件未全命中索引,需针对性规避;优化落地逻辑。

stone_tmp的博客 383

关于clustered 和 noclustered 索引,以及查询优化【MS-SQL】

   1、什么是聚集索引和非聚集索引SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字

MicroヾLi技术Blog 4050

Mysql索引优化实战:从 320ms 到 130ms 的慢 SQL 改造

执行计划分析核心:重点关注 type(扫描方式)、key(索引是否生效)、rows(扫描行数)、Extra(临时表 / 排序 / 索引下推),这 4 个字段能快速定位瓶颈;复合索引设计原则:「过滤性优先→JOIN 字段→排序字段→查询字段」,遵循最左前缀匹配,避免范围条件后置;索引失效高频场景:函数操作、隐式转换、范围条件后的字段复用、模糊查询(% 开头)、OR 条件未全命中索引,需针对性规避;优化落地逻辑。

Java架构师之路的博客 424

阿里云“慢 SQL 优化挑战赛”实战案例详解:如何将 190ms 优化到 2ms?

真名:罗龙九阿里云 RDS 专家团队核心成员拥有六年以上的生产环境调优与诊断经验多次参与双十一数据库稳定性保障精通 MySQL、SQL 调优、执行计划剖析等步骤内容1明确 SQL 查询逻辑,理解表间关系2拆解复杂 SQL,验证每个子条件的筛选效果3分析执行计划,识别全表扫描与潜在问题4选择合理的驱动表(通常数据量小且过滤条件明确)5设计精准复合索引,避免冗余6使用和查隐式转换7调整字段类型、字符集,确保索引可用8验证优化效果并回归测试。

qq_46371374的博客 847

SQL优化之利用索引排序

近期在做数据库的慢SQL优化,从数据库慢日志看到一个SQL执行时间大概1.7s,高峰时候达到十几秒 mysql>SELECTid,service_seq,order_item_seq,s...

cuiruidu3106的博客 3591
上一篇: Oracle 索引(一)
下一篇: MS SQL 索引(三)
iqlife
博客等级 码龄20年 865粉丝 115原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值