数据库之索引的底层数据逻辑及应用

索引(index)是帮助数据库高效获取数据的数据结构。

索引的数据结构

堆存储
一个数据表
使用二叉树存储
使用二叉树存储的
极端情况下的单链形式
极端情况下的单链形式
大数据量下,层级越深,查询效率越低。

平衡二叉树
平衡二叉树

多路平衡查找树
多路平衡查找树
B+树的结构
B+树
所有的数据都存储在叶结点中
叶结点间以单向链表链接

数据库中的B+树结构
数据库中的B+树
叶结点间以双向链表链接

为什么是B+树?

  1. 一个结点存储在一个页上,一页的大小是8K(SQL Server),页不可拆分。B+树中不存放数据,则在一页中可以存放的Key个数更多,使得树的层级减少,查找效率增加;
  2. 搜索效率稳定;
  3. 叶子节点间的双向链表便于排序。

优缺点

索引:帮助高效获取数据的数据结构。
优:

  1. 高效获取数据,减少IO成本。
  2. 通过索引对数据进行排序,降低CPU消耗

缺:

  1. 占用空间
  2. 降低了更新表的效率(insert、update、delete)

哈希索引

哈希索引的数据结构
通过内存中的哈希表来访问数据。
哈希索引的内存用量固定不变,是存储桶数量的函数。
只能进行等值匹配(=,in),不能进行范围查询(between,<,>);
无法利用索引进行排序(哈希值是无序的);
查询效率高,通常只需要一次检索(没有哈希冲突的情况)(效率>B树)

索引分类

物理结构

类型物理存储特点
聚集索引叶节点包含基础表的数据页可以没有但必须唯一
非聚集索引包含索引键值和指向表数据存储位置的行定位器可以有多个

聚集索引

聚集索引的物理存储

聚集索引特殊的方面是:聚集索引的叶级是实际的数据。

表上如果没有建立聚集索引,则是按照堆(HEAP)存放的。
在建立聚集索引时,会开创新的物理空间,将数据重新排序,按照和聚集索引排序条件声明的相同物理顺序存储。但原有的堆表并不会被释放, 旧的结构只有在提交索引创建事务后才会释放。

这意味着,一旦到达索引的叶级,就到达了数据

聚集索引的选取规则:

如果有主键,默认主键索引就是聚集索引;

如果没有主键,数据库引擎会自动向行添加一个唯一标识符RID,使每个键唯一。RID不可被用户查看及访问;

如果对具有多个现有非聚集索引的堆创建聚集索引,则必须重新生成所有非聚集索引,以使它们包含聚集键值而非行标识符 (RID);

在聚集索引中,叶节点包含基础表的数据页;

数据链内的页和行将按聚集索引键值进行排序。 所有插入操作都在所插入行中的键值与现有行中的排序顺序相匹配时执行。

非聚集索引

非聚集索引是为提高聚集索引未涵盖的常用查询的性能。

非聚集索引并不改变其所在表的物理结构,而是额外生成一个聚集索引的B树结构,但叶子节点是对于其所在表的引用,这个引用分为两种,如果其所在表上没有聚集索引,则引用行号。如果其所在表上已经有了聚集索引,则引用聚集索引的页。

非聚集索引,到达了叶级只是找到了数据的引用

非聚集索引的回表查询

索引关键字

类型关键字含义特点
主键索引PRIMARY针对主键建立的索引默认自动创建、唯一
唯一索引UNIQUE避免字段值的重复不唯一
全文索引FULLTEXT查找文本中的关键字不唯一
常规索引实现快速查找不唯一

主键索引:
关键字:primary
针对主键创建的索引,默认自动创建,只能有一个

唯一索引:
关键字:unique
避免表中某列的值重复,确保索引键不包含重复的值,因此,表或视图中的每一行在某种程度上是唯一的。唯一性可以是聚集索引和非聚集索引的属性。
但唯一索引可以有多个

常规索引:快速定位特定数据

全文索引:
关键字:fulltext
查找的是文本中的关键字,而非比较索引中的值

索引语法

CREATE UNIQUE INDEX index_name ON table_name (column_name) ;---非空索引
CREATE PRIMARY KEY INDEX index_name ON table_name (column_name) ;---主键索引

使用ALTER TABLE语句创建索引

alter table table_name add index index_name (column_list) ;
alter table table_name add unique (column_list) ;
alter table table_name add primary key (column_list) ;

查看索引

exec sp_helpindex table_name;

删除索引

drop index index_name on table_name ;
alter table table_name drop index index_name ;
alter table table_name drop primary key ;

验证索引:
在未使用索引之前,执行SQL语句,查看SQL耗时

SELECT * FROM table_name WHERE id = 1;

针对字段建立索引

CREATE INDEX index_name on table_name;

再执行,查看耗时

建立哈希索引

ALTER TABLE MyTable_memop
ADD INDEX ix_hash_Column2 UNIQUE
HASH (Column2) WITH (BUCKET_COUNT = 64);

哈希索引桶计数在索引创建时指定,可使用ALTER TABLE...ALTER INDEX REBUILD语法进行更改。

在大多数情况下,桶计数在理想情况下应该介于索引键中非重复值数目的 1 到 2 倍之间。

单列索引与联合索引

关联一个字段——单列索引;
关联多个字段——联合索引(组合索引)(联合索引中字段的顺序——最左前缀法则)
涉及多个查询条件时,建议使用联合索引

索引失效

最左前缀法则:

查询时从索引的最左列开始,且不跳过索引中的列。如果跳过了,跳过之后的列会失效

范围查询:

在联合索引中,出现范围查询(<,>,between),范围查询之后的列失效

覆盖索引:

查询返回的列在索引中都包含

其他索引失效

在索引列里进行运算操作,索引会失效
类型转换导致索引失效——不给字符串类型加单引号,索引失效
模糊匹配:在头部进行模糊匹配,索引会失效。在尾部进行不会
Or连接:只有所有条件都有索引,索引才会执行
is null可以使用索引,is not null无法使用索引

索引分布影响

如果数据库评估全表查询比使用索引更快,则不使用索引

索引提示

如果数据库评估全表查询比使用索引更快,则不使用索引

前缀索引

scan/seek

全表扫描与索引查找的磁盘 I/O

  • Table Scan 的 Disk I/O
  • Nonclustered Index Scan 的 Disk I/O
  • Clustered Seek 的 Disk I/O
  • Nonclustered Index Seek 的 Disk I/O

index seek是查找从B树的根节点开始,一级一级找到目标行。
index scan则是从左到右,把整个B树遍历一遍

SQL有一个查询优化分析器 Query Optimizer,其在执行查询之前首先会进行分析,当查询中有可以利用的索引时,其会优先分析使用Index Seek进行查询的效率,在使用Index Seek查询效率并不好的情况下,其会使用Index Scan进行查询。
1.在要查询的表中数据不是很多的话,使用Index Seek效率不一定高,因此使用Index seek还要先从索引树开始,然后再利用叶子节点去查找相应的行。在行树比较少的情况下,还没有直接进行Index scan快。
2.在返回的数据量大的情况下,在返回的数据量占总数据量的50%或者超过50%则使用Index Seek效率不一定好,在返回的数据量占10%-15%时,利用Index Seek能获得最佳的性能。
3.在建立索引的列的取值很多是一致的情况下,建立索引不一定能获得很好的效率。

利用统计优化查询

引入关键字(MySQL)

  • DBCC SHOW_STATISTICS
  • CREATE STATISTICS / DROP STATISTICS

索引设计原则

  • 数据量大
  • 查询频繁
  • 常使用where(查询)、order by(排序)、group by(分组)
  • 尽量选择区分度高的字段作为索引,尽量建立唯一索引
  • 尽量使用联合索引,联合索引可以实现覆盖索引,减少回表查询
    索引越多,维护索引的代价越大,增删改的效率会降低——只建立必要的索引
    索引不能储存NULL,因此在创建表示要使用NOT NULL约束。当优化器知道每列是否包含NULL时,可以更好地确定使用哪个索引

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

redis Redis::geoAdd 无效,phpstudy 如何升级redis版本

redis 查看当前版本命令 INFO SERVERwindows 版redis 进入下载 geoadd 功能在3.2之后才有的&#xff0c;但是phpstudy提供的最新的版本也是在3.0&#xff0c;所以需要升级下 所以想出一个 挂狗头&#xff0c;卖羊肉的方法&#xff0c;下载windows 的程序&#xff0c;直接替…

Cache学习(3):Cache地址映射(直接映射缓存组相连缓存全相连缓存)

1 Cache的与存储地址的映射 以一个Cache Size 为 128 Bytes 并且Cache Line是 16 Bytes的Cache为例。首先把这个Cache想象成一个数组&#xff0c;数组总共8个元素&#xff0c;每个元素大小是 16 Bytes&#xff0c;如下图&#xff1a; 现在考虑一个问题&#xff0c;CPU从0x0654…

Vue3 + Scss 实现主题切换效果

Vue3 Scss 实现主题切换效果 先给大家看一下主题切换的效果&#xff1a; 像这样的效果实现起来并不难&#xff0c;只是比较麻烦&#xff0c;目前我知道的有两种方式可以实现&#xff0c;分别是 CSS 变量、样式文件切换&#xff0c;下面是该效果的核心实现方法 CSS变量 给…

3D数字孪生场景编辑器

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 数字孪生的强大功能来自于将真实世界的资产与真实世界的数据联系起来&#xff0c;因此您可以…

95.STL-遍历算法 for_each

算法概述: 算法主要是由头文件 <algorithm> <functional> <numeric> 组成。 <algorithm> 是所有STL头文件中最大的一个&#xff0c;范围涉及到比较、 交换、查找、遍历操作、复制、修改等等 <numeric> 体积很小&#xff0c;只包括几个在序列上面…

激光线提取

在做单线激光三维重建&#xff0c;和多线激光三维重建的时候都会设计到激光线提取算法的实现&#xff0c;如何保持高速和高精度是关键 &#xff0c;最近优化了steger中心线提取算法&#xff0c;通过并行化实现在cpu版本可以做到2m,GPU版本可以做到0.6ms左右&#xff0c;完全可…

华为智能手表独立导航,一呼即应轻松畅行

PetalMaps 手表独立导航&#xff0c;一声令下唤醒导航&#xff0c;打造了智慧的语音交互唤醒体验功能。导航时&#xff0c;语音播报、变道震动提醒功能&#xff0c;让您尽情体验腕上导航乐趣&#xff0c;同时又能安全抵达目的地。

pinpoint链路跟踪运用及日志logback配置

本文将讲述pinpoint的安装&#xff0c;使用及与java logback 日志的集成。 介绍 是什么 是一款 APM监控工具(Application Performance Management/应用性能管理)基于java编写用于 大规模分布式系统 的监控&#xff0c;是 分析 大规模分布式系统 的平台基于google Dapper开发&…

路径规划之A*算法

系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之A*算法 路径规划之A*算法 系列文章目录前言一、前期准备1.1 算法对比1.2 数学式方法1.3 启发式方法 二、A*算法2.1 起源2.2 思想2.3 启发式函数2.4 过程2.5 案例查看 前言 之前提过Dijkstra算…

vue3中readonly和shallowReadonly

readonly: 深度只读数据 获取一个对象 (响应式或纯对象) 或 ref 并返回原始代理的只读代理。 只读代理是深层的&#xff1a;访问的任何嵌套 property 也是只读的。 shallowReadonly 浅只读数据 创建一个代理&#xff0c;使其自身的 property 为只读&#xff0c;但不执行…

文件权限中 chmod、u+x、u、r、w、x分别代表什么

Linux系统中的每个文件和目录都有访问许可权限&#xff0c;如下面所示&#xff1a; 要说清楚问题&#xff0c;我们截取一些内容&#xff1a; ypyubuntu:~$ ls -l drwxr-xr-- 2 ypy ypy 4096 Nov 30 18:33 Desktop/ drwxr-xr-- 2 ypy ypy 4096 Nov 30 18:33 Documen…

视频没有字幕怎么办,怎么给视频增加字幕

文章目录 视频没有字幕怎么办&#xff0c;怎么给视频增加字幕前言软件准备制作字幕1. 导入视频2. 将视频拖拽到轨道3. 生成字幕4. 导出字幕 字幕实时翻译1. 播放视频2. 显示字幕设置3. 双语字幕显示 总结 视频没有字幕怎么办&#xff0c;怎么给视频增加字幕 前言 有时候下载的…

第二节HarmonyOS DevEco Studio创建项目以及界面认识

一、创建项目 如果你是首次打开DevEco Studio&#xff0c;那么首先会进入欢迎页。 在欢迎页中单击Create Project&#xff0c;进入项目创建页面。 选择‘Application’&#xff0c;然后选择‘Empty Ability’&#xff0c;单击‘Next’进入工程配置页。 配置页中&#xff0c;详…

Mysql的分库分表

一、单Mysql节点 假如一主一从 为什么不能无限读&#xff1f; 瓶颈分析&#xff1a; 资源限制&#xff1a; 如CPU、内存、磁盘I/O、网络带宽等。随着读请求的增加&#xff0c;服务器的负载将会增加&#xff0c;甚至可能导致系统崩溃。 连接数限制&#xff1a; MySQL有最大连…

Docker:深入解析Nexus技术构建可靠的软件仓库管理系统

1、简述 在现代软件开发中&#xff0c;有效的软件仓库管理是确保项目成功的关键一环。Nexus Repository Manager作为一种流行的仓库管理系统&#xff0c;为开发人员提供了强大的工具&#xff0c;用于存储、检索和管理软件构建。本文将深入解析Nexus技术&#xff0c;探讨其关键…

GPIO的使用--操作PF09 PF10 PF08实现呼吸灯、跑马灯、警报闪烁灯

先来个呼吸灯演示 呼吸灯 目录 一、GPIO的介绍 1.含义 2.控制原理 3.控制流程 二、LED控制 1.呼吸灯 操作代码 烧录结果 2.蜂鸣器红绿灯交替 操作代码 3.红绿灯交替闪烁 操作代码 一、GPIO的介绍 1.含义 GPIO(general porpose intput output),通用输入输出端口。…

应用密码学期末复习(2)

目录 第二章 2.1数论与密码基础-数论基本概念 2.1.1几个基本概念 2.1.2辗转相除法 2.1.3解一次周余式 2.2密码基础-单表密码 2.2.1单表密码体制 2.2.2单表密码的统计分析 2.3密码基础-多表密码 2.4密码基础-置换密码 第二章 2.1数论与密码基础-数论基本概念 2.1.1几…

window关于下载anaconda 2023年以后的版本,jupyter notebook闪退,没有内核的问题

这种问题的解决办法&#xff1a; 下载anaconda较早版本&#xff0c;比如我下载的是&#xff1a;2022年5月的版本。 下载之后&#xff0c;打开jupyter好像也会没有内核和闪退。 下面解决步骤&#xff1a; 1.注意&#xff1a;打开anaconda powershell prompt 2.重点来了&#xf…

IDEA 2022.1 同一个 spring boot main类运行多个实例

普通的 Java 项目 运行多个实例是非常简单的&#xff0c;直接点击 run 多次即可&#xff0c;但在 spring boot 中默认情况下&#xff0c;是不允许把同一个 web 项目改完端口后多次运行的&#xff0c;如下会显示让你先停止当前实例后再启动&#xff1a; 开启运行多个实例的的方法…

Redis面试题:哨兵模式相关问题,以及脑裂问题

目录 面试官&#xff1a;怎么保证Redis的高并发高可用 面试官&#xff1a;你们使用redis是单点还是集群&#xff0c;哪种集群 面试官&#xff1a;redis集群脑裂&#xff0c;该怎么解决呢&#xff1f; 面试官&#xff1a;怎么保证Redis的高并发高可用 候选人&#xff1a;首先…
最新文章