关于数据库的事务和索引(二)

本文介绍了数据库索引的概念、优缺点及不同类型,包括普通索引、唯一索引、主键索引、聚集索引和非聚集索引,并通过实例说明如何创建和使用它们。

关于数据库的索引

接上一篇博客

上一篇博客:https://blog.youkuaiyun.com/Dongroot/article/details/88739425

本文内容
  1. 什么是索引
  2. 索引的优缺点
  3. 索引的类型
什么是索引

什么是索引,因为我自己也做过好几个项目了,但是都没用过索引,所以被面试官问到的时候也是一脸懵逼,那么什么是索引?

索引就是对数据库表中一列或多列的值进行排序的一种结构索引,使用索引可快速访问数据库表中的特定信息。

这句话比较官方,通俗的讲,索引就相当于图书的目录,作用就是帮助我们在数据量巨大的情况下,提升查询速度。

大家都知道,在关系型数据库中,数据存储是以表的形式存储的,如果要查询一条记录,在没有索引的情况下就是通过一条一条数据去查,直到找到我们需要的数据,这样的代价是,需要花费大量的时间,然后进行大量的I/O操作,所以在数据量巨大的情况下,这种方式很显然是不行的,而索引就是为了解决这个问题,通过建立索引,在查询的时候就先在索引中查找需要的索引值,然后根据索引找到表中的记录,但是索引也有自己的缺点,这个后面再说

还需要知道的一点是,索引的数据结构,是树结构,准确的说是B树或者B+树,大部分的数据库是使用B+树,也有的数据库使用的是哈希桶(对于说的这几个数据结构我都不是很熟悉,感兴趣的可以自己去查一下)

索引的优缺点

索引最大的优点就是在数据量巨大的情况下,能成倍的提高查询效率,注意用词,数据量巨大,意思就是一万条数据都不算的,要是几百上千万条甚至亿级别的数据才会有比较明显的提速效果

假设是一亿条数据,那么最差的情况就是在最后一条数据才找到,这种情况下就需要进行一亿次的I/O操作,而有索引的话就会好很多,假设是一个B+树的索引(简单介绍一下B+树,是一个n叉树,通常一个父节点有多个孩子,B+树的元素插入是从底部插入的,和二叉树相反),假设总共有100层,那么只需要进行100次I/O操作,很明显,成指数级的提高效率

但是也因为是使用的树结构,索引对于增删改操作会有一定的影响,因为这些操作会破坏树的平衡,所以需要重新调整树,所以会有额外的花销

还有就是索引也会占用物理空间

索引的类型

通过上面的两点介绍,对于索引是什么、有什么作用有了一些了解,那么怎么创建索引,索引又分为哪几种呢?

  • 普通索引

普通索引就是最简单的索引,没有任何限制,它的创建方式为

create index 索引名称 on 表名(列名1,列名2.....)

另一个有限制的,就是唯一索引,它不允许表中任何两行具有相同索引值的索引,什么意思呢,假如给年龄加上索引,那么这个表中,每个年龄都只能有一条记录,它的创建方式为

create unique index 索引名称 on 表名(列名1,列名2.....)
  • 主键索引

我们在建表的时候,一般都会给表加上一个主键,id啊这种的,但是有没有发现,主键就很符合上面介绍的唯一索引,其实是数据库自动的为主键创建了主键索引,所以虽然我们平时没有使用到索引,但是数据库还是为我们创建了索引的

  • 聚集索引

聚集索引,就是直接将索引中的键值的逻辑顺序决定了表中相应行的物理顺序,有点不好理解,举个例子

查字典,我们都知道,一般的字典可以按照拼音去查,也可以按照偏旁部首去查,当你要查“啊”这个字的时候,你知道他的拼音的首字母是“a”,所以你就会直接去字典的前几页找这个字,当你要查“张”这个字的时候,你知道他的拼音首字母是“z”,所以你会直接去字典的最后面去找

在这个例子里面,字典内容根据拼音排序,所以字典本身就是数据,同时也是目录,这种就是聚集索引(还不好理解?建议结合非聚集索引一起看,对比区别更容易理解),他的创建方式为

create clustered index 索引名称 on 表名(列名1,列名2.....)
  • 非聚集索引

对比聚集索引来举例子解释

还是查字典,当你遇到一个不认识的字,那么你就只能使用偏旁检索去查,所以你会去字典的偏旁目录,找到你要找的字,而这个时候在偏旁目录上的字,肯定不再是根据拼音排序,然后你会根据你要的字的页码找到他的实际位置

在这个例子里面,有这样一个特点,目录的内容的顺序,和正文的内容的顺序是不一样的,而且目录和正文是分开的,这种就是非聚集索引,它将数据存储在一个地方,索引存储在另一个地方,然后查找的时候,先找索引,再根据索引去找数据的存储位置。他的创建方式为

create nonclustered index 索引名称 on 表名(列名1,列名2.....)

对于索引的介绍,我就介绍到这里,想要深入了解索引的原理,就还需要去了解B+树,我这里推荐一个博客

https://www.cnblogs.com/aspwebchh/p/6652855.html

总结
  • 对于数据库的事务,加强了理解,以前只是对于事务有个了解,当被问到解释事务的ACID的时候,一脸懵逼,还以为说的是隔离级别,但是一看,又发现这些东西自己都见过,只是从来没有记过
  • 我们平常编程的时候基本上没有设置事务的隔离级别,这是因为使用数据库默认的隔离级别,对于我们这样的学生来说,已经绰绰有余,但是对于真正的大项目,隔离级别是数据安全的保障
  • 对于索引,之前一直以为自己没用过,但是实际上自己用的主键就是一个索引,所以这次算是对索引有了一个基础的了解了,以后应该还会继续对索引进行一个深入的了解吧
  • 对数据库的理解也有一定的提高,简历上写掌握这个数据库,掌握那个数据库,可不仅仅是会写SQL语句,会建表,会用程序连接数据库就算掌握了,真正的掌握是掌握数据库的事务,数据库的索引等等
### 数据库事务索引的作用及其相互关系 #### 一、数据库事务的作用 事务数据库管理系统提供的一种机制,用于确保一组操作能够被看作是一个不可分割的整体。其核心目标在于维护数据的一致性可靠性。具体来说,事务具有ACID属性(原子性、一致性、隔离性、持久性)。其中,一致性是指事务执行前后都必须满足数据库的约束条件[^4]。 #### 数据库索引的作用 索引是一种特殊的数据结构,旨在加速数据库中的查询操作。通过创建索引,可以显著减少检索所需的时间成本。常见的索引类型包括但不限于B树/B+树索引、哈希索引以及聚集索引/辅助索引等。每种类型的索引都有各自的优劣之处。例如,哈希索引利用散列函数实现了快速查找的功能,但在范围查询方面存在明显不足[^5];而B+树则更适合于范围查询场景[^2]。 当涉及到多字段组合查询时,可以通过建立联合索引来优化性能。如果仅基于单一字段构建索引,在某些情况下可能仍需回表获取其他未覆盖字段的信息。然而,一旦将这些额外所需的字段也纳入到同一个复合索引定义当中,则可有效避免此类开销——这就是所谓的“索引下推”技术的应用实例[^3]。 #### 三、事务索引之间的联系 尽管事务主要用于保障数据修改过程的安全可靠,而索引侧重提升读写效率,但实际上两者之间存在着紧密关联: 1. **锁机制的影响** 在并发环境下实施更新类SQL语句期间,合理设计并运用索引可以帮助降低锁定资源的数量级,从而缓解潜在死锁风险的同时提高吞吐量。 2. **日志记录负担减轻** 高效的索引策略有助于缩短每次DML(Data Manipulation Language)命令实际影响行数规模,间接减少了重做(redo)/撤销(undo)日记条目生成总量,这对于维持长时间运行的大批量事务尤为重要。 3. **恢复过程中依赖索引重建速度** 如果发生崩溃或其他意外情况致使部分已完成但尚未提交的工作丢失,那么后续重启阶段重新应用必要的变更动作往往离不开先前已存在的各种形式索引支持下的高效定位能力。 ```sql -- 创建一个简单的 B+ 树索引示例 CREATE INDEX idx_name_sex ON user (name, sex); -- 使用该索引来防止回表操作 SELECT id, name, sex FROM user WHERE name='John' AND sex='Male'; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值