关于数据库的索引
接上一篇博客
上一篇博客:https://blog.youkuaiyun.com/Dongroot/article/details/88739425
本文内容
- 什么是索引
- 索引的优缺点
- 索引的类型
什么是索引
什么是索引,因为我自己也做过好几个项目了,但是都没用过索引,所以被面试官问到的时候也是一脸懵逼,那么什么是索引?
索引就是对数据库表中一列或多列的值进行排序的一种结构索引,使用索引可快速访问数据库表中的特定信息。
这句话比较官方,通俗的讲,索引就相当于图书的目录,作用就是帮助我们在数据量巨大的情况下,提升查询速度。
大家都知道,在关系型数据库中,数据存储是以表的形式存储的,如果要查询一条记录,在没有索引的情况下就是通过一条一条数据去查,直到找到我们需要的数据,这样的代价是,需要花费大量的时间,然后进行大量的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语句,会建表,会用程序连接数据库就算掌握了,真正的掌握是掌握数据库的事务,数据库的索引等等