【第五章:MySQL数据库】第21节:MySQL - 必知必会(上)


大家好,很高兴我们可以继续学习交流Java高频面试题。第五章主要是对MySQL数据库进行浅析,我们主要针对面试中常见的MySQL知识点进行交流分析。在对高频面试题分析的过程中,加入实际工作中经常需要使用到的MySQL优化等知识,希望大家可以有效的理解与掌握。

面试中针对MySQL数据库的考察主要集中在以下的知识点:

  • MySQL索引
  • 常用存储引擎
  • MySQL日志模块
  • 事务与隔离级别
  • MySQL的锁机制
  • SQL优化,线上故障排查

在本小节中,我们主要介绍MySQL数据库索引以及存储引擎相关知识点。让我们一起来学习MySQL数据库相关知识点吧~


(1)MySQL的索引有了解吗?(重点掌握)

答:索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息,就像一本书的目录一样,可以加快查询速度。InnoDB 存储引擎的索引模型底层实现数据结构为B+树,所有数据都是存储在 B+ 树中的。

解析:

MySQL的索引是面试必考的一个知识点,希望大家可以理解掌握。不同的存储引擎中存在不同的索引结构,本小节中,我们以最常见的InnoDB为例来阐述。在面试中,还可以接着考察下边的索引知识点。

面试官:“为什么底层数据结构使用B+树,而不是B树?”

  • B+树是B树的变种,B+树的非叶子节点只用来保存索引,不存储数据,所有的数据都保存在叶子节点;而B树的非叶子节点也会保存数据。这样就使得B+树的查询效率更加稳定,均为从根节点到叶子节点的路径。
  • B+树的内部结点并没有指向关键字具体信息的指针,因此其内部结点相对B 树更小,同样空间可以读入更多的节点,所以B+树的磁盘读写代价更低。

面试官:“聚簇索引和非聚簇索引有了解吗?”

聚簇索引也称为主键索引,其索引树的叶子节点中存的是整行数据,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。因为索引(目录)只能按照一种方法进行排序。

非聚簇索引(普通索引)的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

案例解析:

为了让大家更好的理解主键索引和普通索引的区别,我们给出一个具体的案例如下:

我们先来创建一张表User,主键为id,并且拥有字段uid和字段name,uid字段上有索引,建表语句如下所示:

create table User(
id int primary key, 
uid int not null, 
name varchar(16),
index (uid))engine=InnoDB;

接着我们插入如下几条数据:

insert into User values(1,21,'zhangsan'),(2,22,lisi),(3,23,'wangwu'),(5,25,'ywq'),(6,26,'dym');

我们知道,主键上自动创建了主键索引,并且我们手动在uid字段上创建的普通索引。接下来,我们一起看下主键索引树和普通索引树的形状吧~

图片说明

由上图可以看出,左边主键索引树的叶子节点存储的是完整的记录,而普通索引树上存储的是其对应的主键的值。那么主键索引和普通索引在查询方面的差距也就显而易见了吧~

MySQL回表:

  • 如果语句是 select * from User where id=3,即主键查询方式,则只需要搜索 主键索引树。
  • 如果语句是 select * from User where uid=23,即普通索引查询方式,则需要先搜索 普通索引树,得到其对应的主键值为 3,再到主键索引树搜索一次。这个过程称为回表。

覆盖索引:

如果在普通索引树上的查询已经直接提供了结果,不需要回表操作,这样的普通索引叫做覆盖索引。覆盖索引的使用可以显著提高查询效率,是常见的MySQL性能优化手段。

索引的最左前缀原则:

在联合索引的情况下,不需要索引的全部定义,只要满足最左前缀,就可以利

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java开发岗高频面试题全解析 文章被收录于专栏

<p> Java开发岗高频面试题全解析,专刊正文共计31节,已经全部更新完毕。专刊分9个模块来对Java岗位面试中的知识点进行解析,包括通用面试技能,Java基础,Java进阶,网络协议,常见框架以及算法,设计模式等。专刊串点成面的解析每个面试题背后的技术原理,由浅入深,循序渐进,力争让大家掌握面试题目的背后的技术原理,摒弃背题模式的陋习。 专刊详细信息,请查阅专刊大纲和开篇词的介绍。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>

全部评论
催更
2 回复 分享
发布于 2019-12-29 08:22
那个主键索引和普通索引第一行的3、7;23,27啥意思呐?
2 回复 分享
发布于 2020-03-04 22:22
打卡
1 回复 分享
发布于 2020-01-20 10:48
“B+树的内部结点并没有指向关键字具体信息的指针”你好,这句话有点不太理解,B和B+树内部节点不都有关键字吗?关键字具体信息又是指什么呢?望解答,谢谢
1 回复 分享
发布于 2020-03-28 00:27
联合索引树的非叶子节点存储内容是什么样子的?会是联合索引列的数据都在一个节点里吗?
1 回复 分享
发布于 2020-04-25 20:34
05/11 Mark
1 回复 分享
发布于 2020-05-12 06:25
你好,请问一下主键索引和联合索引的区别,还有是不是指定了主键,主键就自动创建了索引,而不需要我们自己手动创建
1 回复 分享
发布于 2020-05-14 16:50
MySQL中最常见的存储引擎有InnoDB和MyISAM,主要区别       MyISAM支持全文索引(FULLTEXT);InnoDB不支持。(严谨点是不是要结合版本来说啊)mysql 5.6以后 InnoDB 引擎也支持全文索引吧。
1 回复 分享
发布于 2020-05-21 03:15
可以把最左前缀原则和索引下推的代码写出来吗?楼主
点赞 回复 分享
发布于 2020-08-15 17:48
二刷打卡
点赞 回复 分享
发布于 2020-08-22 13:53
打卡 一刷。 上次面试问了聚簇索引相关的,可惜当时没看这篇。 继续加油!
点赞 回复 分享
发布于 2020-09-11 16:43
打卡,一刷
点赞 回复 分享
发布于 2020-09-26 16:59
如何实现索引覆盖:将要查询的返回结果值设置为索引。这样就能直接从二级索引中获取想要的值了。
点赞 回复 分享
发布于 2020-12-08 13:44
三刷了,有面试就进来看一下
点赞 回复 分享
发布于 2021-01-26 17:05
打卡
点赞 回复 分享
发布于 2021-02-25 21:06
innodb的索引是聚簇索引,主键索引树的叶子节点存储的是整行的数据。myisam的索引是非聚簇索引,索引树的叶子节点存储的是整行数据的地址。
点赞 回复 分享
发布于 2021-04-07 00:48
主键索引和聚集索引好像不是一样的呀?
点赞 回复 分享
发布于 2021-04-21 19:42

相关推荐

评论
2
2
分享

创作者周榜

更多
牛客网
牛客企业服务