《MySQL学习》 索引 上

MySQL索引的出现就是为了加快数据的查询效率,与字典的前几页目录一样,快速定位你需要的数据所在'页';

索引类型分类

  1. 普通索引
  2. 唯一索引
  3. 主键索引
  4. 组合索引

普通索引

普通索引在数据上无任何限制,值可以为空,一张表可以有多个普通索引

CREATE INDEX index_name ON table(column(length))

唯一索引

唯一索引在普通索引的基础上加了条件必须值不能重复,但可以为空,一张表可以有多个唯一索引

CREATE UNIQUE INDEX indexName ON table(column(length))

主键索引

主键索引一定是唯一索引,但唯一索引不一定是主键,但相比唯一索引,主键索引要求值不能为空,且整张表只能有一个主键索引

ALTER TABLE `table` ADD PRIMARY KEY ( `column` )

组合索引

组合索引由多个索引组合构成,可以是主键索引+唯一索引,也可以是普通索引+普通索引等等

但使用主键索引需要遵循最左前缀原则

ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);

索引的数据结构

索引的实现方式有很多,常见有三种

  1. Hash表
  2. 有序数组
  3. 搜索树

Hash表

Hash表是一种key-value 的数据结构,key由Hash计算所得。由于key可能重复,所有还需要挂上一个链表,在链表上遍历与key是否相等,取出等值的value。

等值查询可以快速定位位置,但如果需要范围查询,那么久需要扫描所有的数据,效率太差。而如果使用有序数组在等值查找和范围查询场景中的性能就都非常优秀

有序数组

有序数组适合存储静态数据,等值查询和范围查询效率都非常高,数组查询修改数据很快,但插入删除数据需要移动位置,效率很差

搜索树

B+树即适合做等值查询,也适合做范围查询

InnoDB的索引模型

InnoDB每个索引都是一棵B+树,每张表都会有有且仅有一个聚簇索引,聚簇索引非叶子节点存放索引值(索引越小,节点存放的索引数据越多),而叶子结点存放页数据(链表的形式存储行记录)

除了聚簇索引,表的其他索引都为非聚簇索引

非聚簇索引 叶子节点存放的是聚簇索引的索引键值,因此,在非聚簇索引上找到的数据需要到聚簇索引上根据索引键值找行记录数据,这一行为称为回表。我们可以使用索引下推来避免回表

索引的维护

B+树为了维护索引的有序性,在插入和删除值的时候,都需要做必要的维护。而如果插入和删除的数据是乱序的,需要移动分割页的数据,产生页分裂和页合并现象。使用自增主键可以避免页分裂现象,逻辑删除可已在一定程度上避免页合并现象

如果一张表需要重建索引(删除主键索引与普通索引),那么应该先删除普通索引,在删除主键索引,最后先创建主键索引,再创建普通索引。 普通索引是基于主键索引的(没有主键就是rowid)。

#23届找工作求助阵地##mysql##java#
全部评论
来学习知识了
点赞
送花
回复
分享
发布于 2023-02-13 09:51 湖北
开始充电
点赞
送花
回复
分享
发布于 2023-02-13 09:54 黑龙江
秋招专场
校招火热招聘中
官网直投

相关推荐

点赞 评论 收藏
转发
#测开面经#非常听劝,之前牛友说我简历乱写,我改了,去投了海鼎的测开 笔试过了,面试的面经如下: 未来的leader挺和善的,感觉有点机会MentorQ:你认为软件测试开发岗是做什么的Q:你认为测试的重要性如何,谈谈对测试的理解Q:软件测试的目的Q:你平时有做测试方面的工作吗 A:简历上红轨,后面两个有Q:谈谈你在红轨项目中的测试是做了哪些方面 A:主要是评价和测试优化方法的可行性Q:说一说你知道的软件测试方法 Q:你的简历上有说你熟悉黑盒白盒灰盒测试,说说黑盒测试关注点在哪Q:灰盒测试与黑盒白盒测试的关系Q:给你一个接口,你怎么用黑盒测试来设计测试常用方法Q:你简历上有了解流水线自动化部署测试的内容,谈一谈你对流水线的理解Q:谈谈你对自动化测试的理解Q:你如何做到CI/CD?Q:给你一个产品/网页,考虑从哪方面着手做测试Q:如果你测试的结果出了问题(与预期不一致),反馈给开发团队,但团队不认为他们是错的,怎么办?Q:你知道我们公司做什么的吗? 我:物流 Mentor:不全是,物流系统只是一部分,还有零售 Q:谈谈你作为一个测试人员应该考虑侧重于对公司业务提供哪方面的技术支持测试?Q:对pytest的了解有多少? A:了解不多,只知道这是个测试框架Q:微信朋友圈用过吗?给你一个微信朋友圈,找出可能的问题测试点,设计测试文档Q:使用过Vue吗?知道Vue的测试侧重点在哪吗?反问:公司对于测试的重点需求是在java接口吗? Mentor:对的,同时也包含产品的一些测试,公司有自己的测试框架,使用比较方便
点赞 评论 收藏
转发
2 2 评论
分享
牛客网
牛客企业服务