【MySQL】——索引(B树B+树)、设计栈

举报
三三是该溜子 发表于 2025/05/05 10:33:05 2025/05/05
861 0 0
【摘要】 ​目录一:索引的特点二:索引适用的场景三:MySQL中索引操作四:数据库的索引底层结构五:MYSQL设计栈前引:考虑有一本书。如何快速找到一个章节所在的位置,就需要一个目录。在数据库中,进行条件查询的时候,我们经常需要遍历表,数据库是把数据存储在硬盘上,此处的时间复杂度O(N)比数据结构中的O(N)要慢很多,因此就可以给数据库引入索引,来提高查询的速度。之前我们学习的MySQL中的parim...

目录

一:索引的特点

二:索引适用的场景

三:MySQL中索引操作

四:数据库的索引底层结构

五:MYSQL设计栈

前引:考虑有一本书。如何快速找到一个章节所在的位置,就需要一个目录。

在数据库中,进行条件查询的时候,我们经常需要遍历表,数据库是把数据存储在硬盘上,此处的时间复杂度O(N)比数据结构中的O(N)要慢很多,因此就可以给数据库引入索引,来提高查询的速度。

之前我们学习的MySQL中的parimary key 和 foreign key 和 unique 都会自动生成索引,这几个操作都会频繁涉及到查询

一:索引的特点
1:加快查询的速度

2:索引自身是一定的数据结构,也要占据存储空间

3:当我们需要进行(增删改)的时候,先根据条件查找(有索引的话就会比较快),之后的(增删改操作)也需要针对索引进行更新

4:一个表的索引可以有多个

例如字典的目录:可以根据汉字拼音首字母快速查询,也可以按照偏旁,笔画等进行查询

二:索引适用的场景
1:对于存储空间要求不高的(存储空间比较充裕)

2:应用场景中,查询较多,增删改操作不多的。(读多写少的场景在web中是很常见的)

三:MySQL中索引操作
1:查看索引
show index from 表名;

查看某个表是否有索引,以及有几个索引

2:创建索引
注:危险操作,如果表是空的或者数据比较少,创建索引没关系,如果表中数据量非常大,创建索引就会触发大量的硬盘IO,很容易把数据库搞挂了

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

代码:create index index_student_name on student (name);

3:删除索引
drop index 索引名 on 表名

注:危险操作,在创建索引之初,我们就要设计规划好表的索引,但是在实际开发中,总会遇到需要添加索引的情况

解决方案:重新搞一台机器,搭建数据库,把生产环境数据库的数据表创建好,并且加上索引,把生产环境数据库的数据,导入到新的数据库中(导入过程非常耗时,但是并不影响生产环境正常工作),用新的数据库的这个机器,替代旧机器

四:数据库的索引底层结构
1:B树
B树又叫B-树(非念B减树,只是符号),B树是一个有序的N叉搜索树,每一个节点上可能有N个值,N个值划分出来N+1个区间

特点:
①:同样高度的B树和二叉搜索树,前者能表示的元素个数更多

②:在搜索的时候B树的比较次数更多

③:虽然B树总的比较次数更多,但是B树的硬盘IO读取次数更少,成本更低(一次硬盘读取相当于内存1w次比较)

解释:同样多的元素个数下,B树存储元素所需要的节点数更少,而硬盘1次读取,是把节点中所有元素一次性读取出来,

2:B+树
在B树的基础上,做出了改进,B+树也是N叉搜索树,划分出来N个区间,根节点上的最后一个值为最大/小值

特点:
(1):B+树一个节点中有N 个key,每个key划分出来N个区间,

(2):根节点中出现的值,在子树中会重复出现

重复出现的优点:

①无需回溯——例子:进行范围查询 id > 4 , id <=10 ,  根据4找到对应的位置,沿着链表在往后面进行查询就可以了,无需在对树进行回溯

②查询时间稳定——查询任何一个元素,都是要从根节点查询到叶子节点的,过程中IO硬盘读取的次数是一样的(稳定比快速更重要)

③存储数据便捷——根节点存储关键字key,叶子结点只需要存储数据即可(例子:如图)。

补充:非叶子节点中存储的关键字key所占空间非常小,占空间大的数据都在叶子节点中,,这些数据都可以缓存到内存当中,正在查询的时候只需要比较内存当中的数据即可,大大减少了硬盘IO的比较次数,节约了成本。

3:每个节点中的最后一个key,是最大值或者最小值,

4:叶子节点之间用链式结构进行连接

五:MYSQL设计栈
谈及“数据库设计”,就是根据需求,来把需要的表给创建出来

1:先根据需求,找到实体

2:梳理清楚实体之间的关系,每个实体之间,需要理清楚关系,不同的关系下,有不同的设计表的方式。

三种关系来设计表

1:一对一
例如:教务系统

学生(实体):学号,班级,姓名,联系方式,入学时间…

账户(描述这个实体):账户名,密码,注册时间,上次登录时间,登陆地点…

方案一:搞一张大表,把这些信息全部放在一起

方案二:搞两张表。用id引用过来,建立联系

student(studentId ,studentName…)

account(accountId,username,password…,studentId)

2:一对多
例如:班级和学生(一个班级可以包含多个学生,一个学生只能从属一个班级)

3:多对多
例如:学生和课程(一个学生可以选择多个课程,一个课程可以被多个学生选择)

4:效率问题
在上一章节我们引入了约束这个概念,约束这些关键词有利也有弊,它们提高了数据正确性,但是影响数据库的执行效率(即牺牲了执行效率,但是换来了开发效率)

在开发中我们往往要考虑两部分

1:执行效率(机器硬件成本较低)

2:开发效率(优先,人力成本较高,更注重这个方面)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。