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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于数据库的索引

接上一篇博客

上一篇博客: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语句,会建表,会用程序连接数据库就算掌握了,真正的掌握是掌握数据库的事务,数据库的索引等等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值