认识索引

什么是索引?

索引:存储着表中一列或者多列值并对值进行排序的数据结构。好比书的目录(index),便于快速查找,定位;如果数据库中没有索引,此时查找的时候就需要把整个表遍历一遍。可以对表中的一列或多列创建索引,并制定索引的类型。

索引的作用

(1)数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书籍目录的关系。
(2)索引所起的作用类似书籍目录,可用于快速定位、检索数据
(3)索引对于提高数据库的性能有很大的帮助

索引的应用场景

(1)当数据量较大,且经常对这些列进行条件查询。
(2)该数据库表的插入,删除,修改操作频率较低
 因为需要动态的维护索引,降低了数据维护速度
(3)磁盘空间足够时(因为索引会占用额外的磁盘空间

索引的缺点

1、创建索引和维护索引需要耗费时间,这种时间随着数据量的增加而增加
2、索引需要占物理空间,除了数据表占用数据空间外,每一个索引还要占一定的物理空间,如果要建立聚簇做引,那么需要的空间就会更大。
3、当对表中的数据进行增加、删除和修改的时候,做引也要动态的维护,这样就降低了数据的维护速度。

使用

创建主键约束(primary key)、唯一约束(unique)、外键约束(foreign key)时会自动创建对应的索引。
索引主要分为普通索引、唯一索引、主键索引、全文索引、复合索引

普通索引:没有任何限制的索引,该索引可以在任何数据类型中创建。索引字段值可以重复;字段本身的约束条件可以判断其值是否为空或唯一。

唯一索引:使用unique约束可以设置唯一索引。该索引的值必须唯一,但可以为NULL。

主键索引:使用主键约束(primary key)自动创建主键索引。该索引的值是唯一的,但不可以为NULL。

全文索引:用来对大表的文本域(char,varchar,text)进行索引。只能创建在char,varchar,text类型字段上。查询数据量较大的字符串字段时,使用全文索引可以提高查询速度。

单值索引:一个索引包含单个列,一个表中可以有多个单值索引

复合索引:一个索引包含多个列,即由多个列的值组成索引。当表的行数远大于索引列的数目时可以使用复合索引。

(1)查看索引

show index from [表名];

(2)创建索引
对于非主键、非唯一约束、非外键字段,可以创建普通索引

create index [索引名] on [表名](字段名);

案例:创建学生表中,name字段的索引

create index idx_student_name on student(name);

(3)删除索引

drop index [索引名] on [表名];

案例:删除学生表中name字段的索引

drop index idx_student_name on student;

主键索引和唯一索引的区别:

主键索引:
1、主键是表中的一个或多个字段,它的值用于唯一地标识表中的某一条记录。
2、一张表中主键只能有一个,而唯一索引可以有多个
3、主键约束的列不能重复且不能为null
4、主键可以被其他表引用为外键,而唯一索引不可以
唯一索引:
1、唯一索引在表中可以有多个
2、唯一索引的列不能重复但可以为null

索引的数据结构

在数据结构中,为了加快查找速度,常见的结构有两种,一种是哈希表,一种是二叉搜索树。
下面我们就从这两种结构开始探究索引真正使用的数据结构
(1)哈希表(hash)
我们知道哈希表的查找效率是比较高的,可以让查询,插入,删除和修改的平均复杂度为O(1),但是只能处理相等的情况,不能处理>,<范围等逻辑。因为哈希的查找过程:就是把key带入哈希函数,计算得到下标,再根据下标取到对应的链表,再去遍历比较key是否相等。
(2)二叉搜索树(中序遍历是有序的)
在这里插入图片描述

例如:查找id >3并且<6的学生信息
先查找id=3的元素
再查找id=6的元素
(上面两步查找按照搜索二叉树典型的方式查找即可)
然后中序遍历3和6之间的结果就是想要的结果

相比于哈希表,二叉搜索树可以处理范围查找,但是效率不高
因为二叉树的每个节点最多两个叉,当数据量比较大的时候,树的高度就会比较高,效率也会变慢。
还有一个原因就是二叉树的中序遍历不是很高效,为O(n)。
(3)B树
真实的索引使用的是B+树,在认识B+树之前,我们先认识一下B树
在这里插入图片描述
B树特点:
(1)不再是二叉搜索,而是N叉搜索, 保存相同个数元素时,树的高度会降低,查询速度快就比二叉树快。
(2)叶子节点,非叶子节点都可以存储数据,且可以存储多个数据
(3)通过中序遍历,可以访问树上的所有节点
(4)B+树
在这里插入图片描述
和B树相比,主要两个地方发生改变了:
(1)数据只在叶子节点上保存,非叶子节点上只保存一些辅助查找的边界信息。
(2)叶子层的元素之间都连接到了一起

B+树的优势:
(1)仍然是N叉树,但是叶子节点不在存储数据,数据值存储在同一层的叶子节点上,B+树的根到每一个节点的路径长度一样,所以查询任何一条记录的速度是比较平均的,不会出现效率差异大的情况。
(2)叶子之间,增加了链表,获取所有节点,不需要中序遍历,使用链表的next节点就可以快速访问到。范围查找时,当定位min和max之后,中间的叶子节点就是结果集,不需要中序回溯。
(3)叶子放到磁盘上,非叶子放在内存中,查找效率就更高了,这样就减少了读磁盘的次数。

为什么说B+树比B树跟还是和实际应用中操作系统的文件索引和数据库索引?
1、B+树的查询效率更稳定
B+树的根到叶子节点的距离都是一样的,数据只存储在叶子节点上
2、B+树不需要进行中序回溯
叶子节点之间增加了链表,进行范围查找时只需要查找到min和max之后中间的叶子节点就是结果集,不需要中序回溯
2、B+树的磁盘读写代价更低
叶子放在磁盘上,非叶子放在内存上,减少了读磁盘的次数。

参考文章:https://mp.weixin.qq.com/s?src=11&timestamp=1596084766&ver=2491&signature=pL9He-fpmb3jfLCaJRVJUFjhE3O4EuipmaCs0oH1NptWD6kPN5d55Fmlr9F-okZmSvH3UFDF4BZSsQo1-NcjLZP*fp0Py5d95jr4yLewjsUgE9BC5ffUUuirVDQqt1CU&new=1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)javaEE_SSH_mysql码头船只出行及配套货柜码放管理系统的设计与实现(源码+数据库sql+lun文+视频齐全)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值