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

数据库索引的理解

目录

1.索引是什么,解决了什么问题

2.索引付出了什么代价

3.如何使用sql索引,有何注意事项

普通索引:

唯一索引:

主键索引(Primary Key Index):

删除索引:

创建主键索引的基本语法:

4.索引背后的数据结构


1.索引是什么,解决了什么问题

在数据库中,索引是一种数据结构,它被设计用来提高数据检索的速度。类似于书籍的目录,索引使得数据库能够快速定位到数据存储的位置,从而加速查询过程。

  1. 提高了查询速度:在数据库中假设有上千万条数据,在没有索引的情况下,我们可能需要遍历整张表,那么这个操作就会非常消耗时间。但是呢,通过创建索引,我们就能直接定位到所需数据的存储位置,从而减少查询时间
  2. 唯一性约束:唯一索引可以确保表中的某一列或多列数据的唯一性,防止重复插入数据

2.索引付出了什么代价

  1. 付出了更多的存储空间,可以理解成用空间来换取时间
  2. 可能会影响增删改的效率,但是整体来说利大于弊,对于这条下面单独讲解

为什么可能会影响增删改的效率呢?原因有以下几点

  • 索引维护成本 : 每次当插入新纪录,删除现有记录或更新索引字段的值,数据库都需要相应的更新索引结构以保证其准确性
  • 磁盘I/O操作增多 : 索引的维护通常涉及磁盘I/O操作,因为索引结构往往存储在磁盘上

3.如何使用sql索引,有何注意事项

   普通索引:

默认类型,允许重复值和空值

基本语法:

create index 下标名 on 表名(列名);

举例说明:

 根据上述图我们不难看出,在Key列,id行有一个MUL,那么这个MUL是什么意思呢?

‘MUL’表示该列上有非唯一索引,也就是我们所说的普通索引

‘UNI’表示该列上有唯一索引

'PRI'表示该列上有非唯一索引

当然,查看索引是否创建成功我们不止有desc 表名这一种方法,我们还可以使用show index from 表名,这种方法就不在这里展示了

唯一索引:

确保数据的唯一性和准确性,不允许有重复的值(除了NULL值)

基本语法:和普通索引差不多,只不过是多了一个unique关键字

create unique index 索引名 on 表名(列名);

举例说明:

这里的 'UNI' 参考上文普通索引的补充 

主键索引(Primary Key Index):

首先,每个表只能有一个主键,主键的值必须唯一且不能为空(NULL)。由于主键的唯一性和非空性,主键索引自然也具有唯一性,这意味着索引中的每个值必须是唯一的

在数据库中普通索引,唯一索引和主键索引是可以共存的,这里只是为了方便演示就把普通索引和唯一索引,删除索引的方式如下

删除索引:

基本语法:

drop index 索引名 on 表名;

举例说明: 

创建主键索引的基本语法:

alter table 表名 add primary key(列名);

 举例说明:


索引是针对列来创建的,后续查询的时候,查询条件使用的列和索引列匹配,才能索引生效,才能提高效率

针对一个比较大的表,创建/删除索引是一个非常危险的操作,可能会触发大量硬盘IO,把机器搞挂

那么这个硬盘IO又是什么呢?简单来说就是,硬盘I/O(Input/Output,输入/输出)是指硬盘与计算机系统之间进行的数据传输操作,具体包括读取(Read)和写入(Write)两个基本过程。

4.索引背后的数据结构

特点:

  • 每个节点上包含N个key,划分出N个区间
  • 每个父节点的元素都会下沉到子节点中,作为该子节点中最大值的角色来存在
  • 叶子节点这一层就构成了数据集合的全集
  • 使用类似于链表这样的结构,把叶子节点串起来

优势:

  • 高度比较低,降低了硬盘IO次数
  • 范围查询非常方便&高效
  • 所有查询都落到叶子节点上,开销稳定,容易预估成本
  • 叶子结点存储

根据上图我们可以看见每一层的数字都作为下一层的最大值,而叶子结点写的并非是真正的值,而是一个一个行,比如这个 “1” 可能存放的是 “1  张三  法务部” 这条记录,表里的每一行都是挂在B+树的叶子结点上面的,而非叶子节点只需要存储key的值即可,不需要存储数据行

相关文章:

  • Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用
  • Python实用代码片段分享(三)
  • Python3 函数参数
  • tongweb7049m1升级到tongweb7049m3,启动 报错:realm can not be null(by jjz+yjm+lqw)
  • 开窗函数!
  • Android实现无线连接ADB调试
  • STM32学习和实践笔记(33):待机唤醒实验
  • 操作系统 - 文件管理
  • LeetCode 算法:接雨水c++
  • 【刷题(16)】子串
  • 提莫攻击 ---- 模拟算法
  • 备战十一届大唐杯国赛预选赛
  • C# as运算符
  • Visual Studio Code使用(C++项目新建,运行)
  • 快速入门文件操作+5种例子演示
  • co模块的前端实现
  • crontab执行失败的多种原因
  • css系列之关于字体的事
  • Github访问慢解决办法
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • MySQL QA
  • Python中eval与exec的使用及区别
  • React-生命周期杂记
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 复习Javascript专题(四):js中的深浅拷贝
  • 批量截取pdf文件
  • 前端学习笔记之观察者模式
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​批处理文件中的errorlevel用法
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 计算机视觉入门
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • ###STL(标准模板库)
  • #etcd#安装时出错
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (2)STL算法之元素计数
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (AngularJS)Angular 控制器之间通信初探
  • (C语言)fread与fwrite详解
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (Java)【深基9.例1】选举学生会
  • (k8s中)docker netty OOM问题记录
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (含答案)C++笔试题你可以答对多少?
  • (剑指Offer)面试题34:丑数
  • (六)vue-router+UI组件库
  • (四)js前端开发中设计模式之工厂方法模式
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .gitignore文件设置了忽略但不生效