当前位置: 首页 > news >正文

MsSQL中的索引到底长啥样,查找过程怎么进行

参考文章一

参考文章二

建表

mysql> create table user(-> id int(10) auto_increment,-> name varchar(30),-> age tinyint(4),-> primary key (id),-> index idx_age (age)-> )engine=innodb charset=utf8mb4;insert into user(name,age) values('张三',30);
insert into user(name,age) values('李四',20);
insert into user(name,age) values('王五',40);
insert into user(name,age) values('刘八',10);mysql> select * from user;
+----+--------+------+
| id | name  | age |
+----+--------+------+
| 1 | 张三  |  30 |
| 2 | 李四  |  20 |
| 3 | 王五  |  40 |
| 4 | 刘八  |  10 |
+----+--------+------+

聚簇索引(Clustered Index)即索引结构和数据一起存放的索引,并不是一种单独的索引类型。InnoDB 中的主键索引(Primary Key)就属于聚簇索引。

非聚簇索引(Non-Clustered Index)即索引结构和数据分开存放的索引,并不是一种单独的索引类型。二级索引(Secondary Index)就属于非聚簇索引。

聚簇索引(Clustered Index)和 非聚簇索引(Non-Clustered Index) 是从 索引结构和数据存放方面 来对索引来划分类型。

数据表的主键列使用的就是主键索引(Primary Key)。

二级索引(Secondary Index)又称为辅助索引,是因为二级索引的叶子节点存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。

唯一索引,普通索引,前缀索引等索引属于二级索引。

id 字段是主键索引,age 字段是二级索引(辅助索引)。
所以 id 字段是聚簇索引,age 字段是非聚簇索引。

索引结构

id 是主键,所以是聚簇索引,其叶子节点存储的是 id 主键对应的行记录的数据。

id 索引结构

在这里插入图片描述

age 索引结构

在这里插入图片描述

查找过程

查找id

如果查询条件为主键(聚簇索引),则只需扫描一次 B+ Tree 即可通过聚簇索引定位到要查找的行记录数据

select * from user where id = 1

在这里插入图片描述

查找age

查询条件为普通索引(非聚簇索引),需要扫描两次 B+ Tree,
第一次扫描通过普通索引定位到聚簇索引的值,然后第二次扫描通过聚簇索引的值定位到要查找的行记录数据(第二次查询也称为回表查询)。

select * from user where age = 30;

在这里插入图片描述

在这里插入图片描述

tips

覆盖索引

  • 覆盖索引是指一个索引包含了查询语句中所需的所有字段,因此可以直接返回查询结果而不需要进行回表查询。
  • 优点在于它能够减少磁盘 I/O 和提高查询性能,因为数据库引擎可以直接从索引中获取所需的数据,而不必去实际的数据表中获取。

联合索引

联合索引是指针对多个字段创建的单个索引,它可以涵盖多个字段的查询条件,并且在某些情况下可以提高查询效率。

http://www.lryc.cn/news/264970.html

相关文章:

  • WPF 全局异常处理
  • Flink系列之:Elasticsearch SQL 连接器
  • java中将Map集合、对象、字符串转换为JSON对象
  • 理解Spring中bean的作用域
  • edge中以右键“打印”的方式“保存”当前页面的pdf形式,下载过程中卡进度的问题
  • c# 使用OpenCV
  • 数据库连接问题 - ChatGPT对自身的定位
  • 常见可视化大屏编辑器有哪些?
  • 利用ffmpeg cv2取h265码流视频(转换图片灰屏问题解决)
  • Android Uri scheme协议file转content
  • 【Jenkins】远程API接口:Java 包装接口使用示例
  • 未能加载工具箱项问题的解决
  • 算法模板之栈图文详解
  • Ajax Search Pro Live WordPress网站内容实时搜索插件
  • mysql SQL执行超时问题
  • 51单片机基于时间片轮转的简单rtos
  • python pycurl 安装使用
  • C语言数据结构-排序
  • Spring AOP入门指南:轻松掌握面向切面编程的基础知识
  • 【顶级快刊】IEEE(Trans),审稿快仅2个月录用,入选CCF-B,现在投最快!
  • 深入浅出堆排序: 高效算法背后的原理与性能
  • Golang实践录:gin绑定解析json的两种方法
  • Hypervisor Display架构
  • 基于ssm二手车交易平台的设计论文
  • IDEA 设置 SpringBoot logback 彩色日志(附配置文件)
  • 数学建模学习笔记-皮尔逊相关系数
  • 随笔:集成学习:关于随机森林,梯度提升机的东拉西扯
  • 多款实用个人年终总结模板,助力你的年度汇报!
  • 【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化
  • Centos9(Stream)配置Let‘s Encrypt (免费https证书)