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 和提高查询性能,因为数据库引擎可以直接从索引中获取所需的数据,而不必去实际的数据表中获取。

联合索引

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

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MSSQL 数据库,可以使用以下方法来查找和处理索引问题: 1. 执行查询计划分析:使用 SQL Server Management Studio (SSMS) 或其他工具,执行慢查询的查询计划分析。通过查看执行计划,可以确定是否存在索引扫描或者其他低效操作,以及是否建议创建新的索引。 2. 使用动态管理视图 (DMV):MSSQL 提供了一些 DMV,可以帮助识别索引问题。例如,可以使用 sys.dm_db_index_usage_stats 视图来查看索引的使用情况,确认哪些索引没有被使用,或者被低效地使用。 3. 使用索引优化向导:SSMS 提供了一个索引优化向导,可以帮助你识别需要创建、删除或修改的索引。通过执行向导,它会分析查询和表的结构,并提供建议来优化索引。 4. 定期维护索引:确保定期维护索引以提高性能。这包括重新组织或重建索引、更新统计信息等。 5. 删除不需要的索引:检查是否存在不需要的、重复的或者不再使用的索引。这些索引可能会增加写操作的开销,并占用存储空间。 6. 注意索引列顺序:索引列的顺序对查询性能有影响。根据查询的过滤条件和排序要求,选择合适的索引列顺序。 7. 考虑覆盖索引:使用覆盖索引可以减少查询的 I/O 操作,提高查询性能。覆盖索引包含了查询所需的所有列,避免了回表操作。 请注意,在处理索引问题之前,建议在开发或测试环境进行验证和测试。此外,如果需要更深入的优化或处理复杂的索引问题,可能需要咨询专业的数据库管理员或性能优化专家。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值