MySQL 聚集与非聚集索引

news2025/2/26 17:59:21

文章目录

  • 1.聚集索引
    • 1.1 介绍
    • 1.2 优点
    • 1.3 缺点
  • 2.非聚集索引
  • 3.区别
  • 参考文献

MySQL 中,根据索引树叶结点存放数据行还是数据行的地址,可以将索引分为两类:

  • 存放数据行:聚集索引
  • 存放数据行地址:非聚集索引

InnoDB 使用聚集索引,MyISAM 使用非聚集索引。

1.聚集索引

1.1 介绍

聚集索引(Clustered Index)也叫聚簇索引,一般以主键建立索引。

在 InnoDB 中如果没有定义主键,会选择第一个非空唯一索引来代替。如果没有这样的索引,InnoDB 会自动生成一个不可见的列名为 ROW_ID,索引名为 GEN_CLUST_INDEX 的聚簇索引,该列是一个 6 字节的自增数值,随着插入而自增。

聚集索引(Clustered Index)的索引和表数据放在一个文件,行数据存储存在索引树叶子结点上,通过索引可直接获得行数据

在这里插入图片描述

与聚集索引配套使用的是二级索引(Secondary Indexes),也叫辅助索引。

一个表可以有多个二级索引。

二级索引树叶子结点存储的是主键。

若对非主键字段建立的索引就是二级索引,根据二级索引搜索,则需要两步:

  1. 第一步在二级索引(辅助索引)B+ 树中检索,到达其叶子结点获取对应的主键。
  2. 第二步使用主键在主键索引 B+ 树中再执行一次 B+ 树检索操作,最终到达叶子节点即可获取行数据。

在这里插入图片描述

1.2 优点

  • 主键查询效率更高

通过主键使用聚集索引查找数据比非聚集索引要快,因为非聚集索引定位到对应主键时还要多一次目标记录磁盘 IO,即回表查询。

  • 范围查询效率更高

聚集索引存储记录,记录物理存储按照索引排序,物理上有序。因此范围查询(例如,使用 BETWEEN、>、< 等条件)可以更有效地利用磁盘上的顺序数据。而非聚集索引是逻辑上有序,物理存储并不有序。

  • 辅助索引易维护

当出现行移动或者数据页分裂(Page Split)时,InnoDB 无须更新辅助索引。

数据页是存储数据行的物理存储单元,它通常包含一定数量的数据行,以及用于管理数据页的页头信息。

页分裂指的是当一个数据页已经满了,需要插入一条新的记录但无法容纳时,数据库引擎将尝试重新组织页上的数据,将一部分数据移动到新的页上,从而为新记录腾出空间。

1.3 缺点

  • 二级索引访问需要两次索引查找。

第一次找到主键值,第二次根据主键值找到行数据。

  • 更新主键的代价高。

因为将会导致被更新的行发生移动,所以 InnoDB 表主键一般定义为不可更新。

  • 插入速度严重依赖于插入顺序。

按照主键顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于 InnoDB 表,我们一般都会定义一个自增的 ID 列为主键。

2.非聚集索引

按照语义,除了聚集索引,其他索引都是非聚集索引。

但在这里非聚集索引特指索引树叶结点存储的是「索引+数据地址」的索引。

非聚集索引(Nonclustered Index)的索引文件和表数据是分开的,主键索引和二级索引存储上没有任何区别。使用 B+ 树存储索引,所有节点都是索引,叶子结点存储的是「索引+数据地址」。

在这里插入图片描述

3.区别

  • 数量不同。

一个表中只能有一个聚集索引,而非聚集索引可以有多个。

  • 磁盘 IO 次数不同。

聚集索引通过一次索引查询可以直接找到数据,而非聚集索引需要一次索引查询到数据地址,外加一次数据磁盘 IO。

  • 数据组织方式不同。

聚集索引的数据行在物理存储上是有序的,对于范围查询和排序操作,有序的物理存储结构也有助于减少磁盘 I/O 操作,提高查询性能。非聚集索引和数据行是分开两个文件存放,数据行在物理存储上是乱序的。

  • 读写性能不同。

聚集索引查询效率高,但插入效率低,因为需要移动数据的物理位置保证物理存储上有序。非聚集索引则反过来,插入效率高,查询效率低。


参考文献

15.6.2.1 Clustered and Secondary Indexes
索引常见面试题 - 小林coding

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1416097.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode 1.85.0更新的3个实用功能

1、单个文件可直接拖拽为独立窗口 当单文件过长&#xff0c;直接分成两个视图就不用上下频繁滚动 2、将终端移动到编辑器区域 此时&#xff0c;终端也可像文件一样拖拽为独立窗口 3、文件夹目录粘性头部 默认关闭&#xff0c;需要设置 "workbench.tree.enableStickyScro…

【Linux】编写第一个小程序:进度条

文章目录 1. 预备知识1.1 简单认识几个函数1.1.1 sleep()1.1.2 fflush()1.1.3 usleep()1.1.4 memset() 1.2 缓冲区1.3 回车与换行 2. 编写入门版的进度条2.1 基本逻辑2.2 美化效果2.3 代码实现2.4 执行效果 3. 编写升级版的进度条3.1 代码实现3.2 执行效果 1. 预备知识 1.1 简…

php项目中laravel框架下用postman调用接口实战总结

一.项目接口实战总结: 1.传参赋值错乱问题&#xff0c;如下&#xff1a; SQLSTATE[HY093]: Invalid parameter number (SQL: select count(*) as aggregate from cars where company_id 3345 and status ! 7 and user_id in (2148, 2060, 2061, 2432, 2136, 1970, 1987, 202…

Spark Exchange节点和Partitioning

​Exchange 在explain时&#xff0c;常看到Exchange节点&#xff0c;这个节点其实就是发生了数据交换 此图片来自于网络截取 BroadcastExchangeExec 主要是用来广播的 ShuffleExchangeExec 里面决定了数据分布的方式和采用哪种shuffle 在这里可以看到好几种不同的分区器 shuf…

shell 脚本 点菜啦

#!/bin/bash sum0 PS3"请输入(1-6):" MENU" 宫保鸡丁 酸菜鱼 鱼香肉丝 佛跳墙 水煮肉片 点菜结束 "select menu in $MENU do case $REPLY in 1) echo $menu 价格是20 let sum20 ;; 2) echo $menu 价格是60 let sum60 ;;3) echo $menu 价格是25 let sum25 ;…

在linux上进行编译调试

1.相关疑问 1. 为什么在代码里使用了一个未定义过的函数&#xff08;如add()&#xff09;&#xff0c;在编译阶段不会报错&#xff0c;在链接阶段会报错呢&#xff1f; 答&#xff1a;先说几个代码编译的结论&#xff1a; 单个\.c源文件文件被编译成机器码文件时&#xff0c…

如何把openwrt的ipk软件包安装到ubuntu上

前提&#xff1a;都是arm64的架构的软件包。 下载openwrt的ipk软件包 1. 从https://pkgs.org/ 查找下载软件包&#xff1a; 本文以swconfig软件包为例&#xff0c;下载swconfig和相关的依赖软件包&#xff1a; swconfig_12_aarch64_cortex-a72.ipk libuci20130104_2021-10-2…

认识与探索大模型时代的RPA应用及进化(上)

AI Agent当前仍然处于技术爬坡与实验阶段&#xff0c;特别是在企业领域&#xff0c;真正的成熟应用还处于广泛探索与原型验证阶段&#xff0c;离成熟还尚待时日。而同时另外一种在最近几年广受欢迎的自动化解决方案-RPA&#xff08;机器人流程自动化&#xff09;也在LLM时代不断…

python使用迭代生成器yield减少内存占用的方法

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 在python编码中for循环处理任务时&#xff0c;会将所有的待遍历参量加载到内存中。 其实这本没有必要&#xff0c;因为这些参量很有可能是一次性使用的&#xff0c; 甚至很多场景下这些参量是不需要同时存储在内存中的&…

IM-CNN

SHAP means ‘Shapley additive explanation’ 辅助信息 作者未提供代码

基于ncurse的floppy_bird小游戏

1. 需求分析 将运动分解为鸟的垂直运动和杆的左右运动。 2. 概要设计 2.1 鸟运动部分 2.2 杆的运动 3. 代码实现 #include <stdio.h> #include <ncurses.h>#include <stdlib.h> #include <time.h>int vx 0; int vy 1;int bird_r; int bird_c;int…

HTML5和CSS3的新特性

HTML5的新特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等 1&#xff0c;HTML5新增的语义化标签 <header> 头部标签 <nav> 导航标签 <article> …

1 月 28日算法练习-前缀和

小郑的蓝桥平衡串 思路&#xff1a;把 L 看成 1&#xff0c;Q 看成 -1&#xff0c;利用前缀和来得到输入串的前缀子串中LQ 的和&#xff0c;利用前缀和差的性质得到子串&#xff0c;通过枚举看它是否平衡。 将L看做1&#xff0c;Q看做&#xff0d;1&#xff0c;只有当某个区间…

Django实战

一、开发登录表单 def login_form(request):html <html><body><form method"post">用户名:<input name "username" type"text"></input></br>密码&#xff1a;<input name "password" type…

ARM常用汇编指令

文章目录 前言一、处理器内部数据传输指令MOV&#xff1a; 将数据从一个寄存器复制到另一个寄存器。MRS&#xff1a; 将特殊寄存器(CPSR,SPSR)中的数据传给通用寄存器。MSR&#xff1a; 将通用寄存器中的数据传给特殊寄存器(CPSR,SPSR)。 二、存储器访问指令LDR:用于从内存中加…

5G赋能智慧文旅:科技与文化的完美结合,打造无缝旅游体验,重塑旅游业的未来

一、5G技术&#xff1a;智慧文旅的强大引擎 5G技术的起源可以追溯到2010年&#xff0c;当时世界各国开始意识到4G技术已经达到了瓶颈&#xff0c;无法满足日益增长的移动通信需求。2013年&#xff0c;国际电信联盟&#xff08;ITU&#xff09;成立了5G技术研究组&#xff0c;开…

力扣LCR 180. 文件组合(双指针)

Problem: LCR 180. 文件组合 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 本题目可以利用滑动窗口的技巧&#xff08;滑动窗口就是双指针的运用&#xff09;解决&#xff0c;具体实现如下 1.逻辑上生成窗口&#xff1a;让两个指针i&#xff0c;j分别初始化为1…

IPv6报文格式(全网最详细)

IPv6报文格式 报文格式 图1 IPv6报文头格式 表1 IP头字段解释 字段长度含义Version4比特 4&#xff1a;表示为IPV4&#xff1b;6&#xff1a;表示为IPV6。Traffic class8比特流量类别。该字段及其功能类似于IPv4的业务类型字段。该字段以区分业务编码点&#xff08;DSCP&…

203.移除链表元素(力扣LeetCode)

文章目录 203.移除链表元素题目描述原链表删除元素虚拟头节点 203.移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head …

基于Micropython利用ESP32-C3驱动墨水屏显示图片

从咸鱼上淘了两块2.9寸的墨水屏价签&#xff0c;可以结合ESP32-C3做个低功耗的时钟温湿度计。 1、所需硬件 合宙的ESP32-C3&#xff1a; 电子价签拆出来的2.9寸墨水屏&#xff1a; ——电子价签型号为&#xff1a;Stellar-L&#xff0c;墨水屏型号为&#xff1a;E029A01。电子…