【面试题】面试官:说说你对MySQL的了解

news2024/11/24 5:29:28

文章目录

  • 基础篇
    • 非关系型数据库和关系型数据库的区别?
    • MySQL 数据库两种存储引擎的区别?
  • 索引篇
    • 为什么索引能提高查询速度?
    • 聚集索引和非聚集索引的区别?非聚集索引一定回表查询吗?
    • 索引这么多优点,为什么不对表中的每一个列创建一个索引呢?(使用索引一定能提高查询性能吗?)
    • Hash 索引和 B+树索引优劣分析
    • B+树做索引比红黑树好在哪里?
    • 最左前缀匹配原则了解么?

今天给大家推荐几道常见的MySQL面试题,来试试你能答对几道?
在这里插入图片描述

基础篇

非关系型数据库和关系型数据库的区别?

🙋‍♂答:

  1. 存储数据的类型不同。
    关系型数据库使用二维的表来进行存储;非关系型数据库有多种数据存储方式,比如Redis使用K-V存储。
  2. 查询效率不同。
    关系型数据库的数据是持久化了的。只能和硬盘进行I/O;而非关系型数据库可以存储在硬盘上,也可以存储在内存中,从内存读取数据要比硬盘快得多。在处理大量数据时,可以考虑使用非关系型数据库来提升效率。

MySQL 数据库两种存储引擎的区别?

🙋‍♂答:

  1. 对事务的支持:InnoDB存储引擎支持事务,MyISAM不支持事务。也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB。
  2. 执行SELECT COUNT() FROM TABLE 效率:MyISAM引擎中直接保存了表的行数,当执行SELECT COUNT() FROM TABLE 时,就不需要进行全表扫描。
  3. 加锁级别:InnoDB锁的细粒度比MyISAM高,InnoDB有行级锁,MyISAM最高是表级锁。

综上所述:如果数据库读的操作远远多于写的操作,并且对事务无要求,可以考虑使用MyISAM;如果对于并发量比较大的场景,使用InnoDB。

索引篇

为什么索引能提高查询速度?

🙋‍♂答:

如果不使用索引,MySQL直接走全表扫描,这样查询到想要的数据可能会进行很多次磁盘I/O,是很浪费时间的;如果使用索引,比如MySQL使用B + 树作为索引,B + 树就是很高效的数据结构,可以有效减少磁盘I/O的次数。
B+Tree 存储千万级数据只需要 3-4 层高度就可以满足,从千万级的表(1000 * 1000 * 16)查询目标数据最多需要 3-4 次磁盘 I/O。

聚集索引和非聚集索引的区别?非聚集索引一定回表查询吗?

🙋‍♂答:

聚簇索引的叶子节点存放的是实际数据,所有完整的用户记录都存放在叶子节点

一般情况下会使用主键作为聚簇索引,由于一张表只能有一个聚簇索引,为了实现非主键字段的快速搜索,就引出了二级索引(非聚簇索引/辅助索引),它也是利用了 B+ 树的数据结构,但是二级索引的叶子节点存放的是主键值,不是实际数据。

第二个问题:
首先要知道回表是什么?

回表,就是先检索二级索引,找到叶子节点并获取主键值,通过聚簇索引查询到对应的叶子节点,也就是要查两个 B+Tree 才能查到数据

显而易见的,非聚簇索引不一定需要回表操作。索引覆盖,覆盖索引是指 SQL 中 查询 的所有字段,都能直接从二级索引中查询得到记录,而不需要通过聚簇索引查询获得,可以避免回表的操作,也就是只需要查一个 B+Tree就能找到数据

举例:

	select id from product where product_no = '0002';

这种在二级索引的 B+Tree 就能查询到结果的过程就叫作「覆盖索引」,也就是只需要查一个 B+Tree 就能找到数据

索引这么多优点,为什么不对表中的每一个列创建一个索引呢?(使用索引一定能提高查询性能吗?)

🙋‍♂答:

索引也有缺点:

  • 首先,索引是一种数据结构,也需要占用磁盘空间。并且创建、维护索引要耗费时间,这种时间随着数据量的增加而增大;
  • 索引有可能失效。

索引也有适用范围:

  • 字段有唯一性限制,比如商品编码。
  • 经常用于 WHERE 查询条件、GROUP BY 和 ORDER BY 的字段
    • 在查询的时候就不需要再去做一次排序了,因为 B+Tree 的记录都是有序的。

相对应的也有不适合适用索引的时候:

  • 字段中存在大量重复数据,不需要创建索引
    • MySQL 有一个查询优化器,查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。
  • WHERE 条件,GROUP BY,ORDER BY 里用不到的字段
    • 因为索引的价值是快速定位,如果起不到定位作用的字段不需要创建索引。
  • 表数据太少的时候,不需要创建索引。
  • 如果字段经常更新,不需要创建索引。
    • 维护B + 树的结构,就需要频繁重建索引,影响数据库性能。

Hash 索引和 B+树索引优劣分析

🙋‍♂答:

优势等值查询:在查询速度上,如果是等值查询,那么Hash索引明显有绝对优势,因为只需要经过一次 Hash 算法即可找到相应的键值,复杂度为O(1)。

劣势:

  • 无法范围查询: Hash 索引是无序的,如果是范围查询检索,这时候 Hash 索引就无法起到作用,即使原先是有序的键值,经过 Hash 算法后,也会变成不连续的了。
  • 无法使用联合索引: 并且Hash索引不支持联合索引查询。
  • 存在哈希碰撞问题: 在有大量重复键值情况下,哈希索引的效率极低。

综上:大多数场景下,都会有组合查询,范围查询、排序、分组、模糊查询等查询特征,Hash 索引无法满足要求,建议数据库使用B+树索引。

离散型高,数据基数大,且等值查询时候,Hash索引有优势。

B+树做索引比红黑树好在哪里?

🙋‍♂答:

红黑树(Red Black Tree)是一种自平衡的二叉查找树,它与平衡二叉树相同的地方在于都是为了维护查找树的平衡而构建的数据结构,它的主要特征是在二叉查找树的每个节点上添加了一个属性表示颜色,颜色有两种,红与黑。

当数据量特别大的时候,会导致红黑树的高度变高,磁盘IO操作次数就会变多,影响整体数据查询效率。

最左前缀匹配原则了解么?

🙋‍♂答:

联合索引按照最左匹配原则,如果创建了一个 (a, b, c) 联合索引,查询条件存在a就可以匹配上联合索引,比如where a=1;

联合索引的最左匹配原则会一直向右匹配直到遇到范围查询(>、<)就会停止往下使用联合索引。也就是范围查询的字段可以用到联合索引,但是在范围查询字段之后的字段无法用到联合索引。注意,对于 >=、<=、BETWEEN(类似于>=、<=)、like 前缀匹配,这类范围查询,并不会停止使用索引,两个字段都会用到联合索引查询,但是只是 = 的部分用到了。

比如联合索引(a,b),a全局有序(1,2,2,3,4,5),b是全局无序的(12,7,8,2,3,1)。因此,直接执行where b = 2这种查询没办法利用联合索引。利用索引的前提是,索引里的key是有序的。

只有在 a 相同的情况才,b 才是有序的,比如 a 等于 2 的时候,b 的值为(7,8),这时就是有序的,这个有序状态是局部的,因此,执行where a = 2 and b = 7是 a 和 b 字段能用到联合索引的,也就是联合索引生效了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

八岁都能懂:BFS判断一个图是二分图

目录 1 什么是二分图2 进入情境3 代码实现4 BFS是什么&#xff1f; 1 什么是二分图 一个图用两种颜色涂&#xff08;橙黄和橘绿&#xff09;&#xff0c;相邻节点不能同色&#xff0c;如下图&#xff0c;4与5相邻且同色&#xff0c;所以不是二分图。 2 进入情境 第一版&#xf…

微服务高频面试题

1、Spring Cloud 5大组件有哪些&#xff1f; 早期我们一般认为的Spring Cloud五大组件是 Eureka : 注册中心Ribbon : 负载均衡Feign : 远程调用Hystrix : 服务熔断Zuul/Gateway : 网关 随着SpringCloudAlibba在国内兴起 , 我们项目中使用了一些阿里巴巴的组件 注册中心/配置…

【论文】SimCLS:摘要总结的对比学习(2)

SimCLS:摘要总结的对比学习(1&#xff09; 写在最前面2 抽象总结的对比学习框架 写在最前面 SimCLS: A Simple Framework for Contrastive Learning of Abstractive Summarization&#xff08;2021ACL会议&#xff09; https://arxiv.org/abs/2106.01890 论文&#xff1a;htt…

HTTP第四讲——域名和DNS

IP 协议的职责是“网际互连”&#xff0c;它在 MAC 层之上&#xff0c;使用 IP 地址把 MAC 编号转换成了四位数字&#xff0c;这就对物理网卡的 MAC 地址做了一层抽象&#xff0c;发展出了许多的“新玩法”。 例如&#xff0c;分为 A、B、C、D、E 五种类型&#xff0c;公有地址…

[GFCTF 2021] day2

Baby_Web 查看源码发现 <!--源码藏在上层目录xxx.php.txt里面&#xff0c;但你怎么才能看到它呢?--> 然后抓包看中间件&#xff0c;Apache/2.4.49 (Unix) 存在目录穿越漏洞 curl http://node4.anna.nssctf.cn:28805/cgi-bin/.%2e/.%2e/.%2e/.%2e/var/www/index …

快速上手分布式异步任务框架Celery

一、Celery架构介绍 Celery&#xff1a;芹菜&#xff1f;&#xff08;跟翻译没有任何关系&#xff09;&#xff0c;分布式异步任务框架&#xff08;跟其他web框架无关&#xff09; Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please…

【嵌入式系统】课程复习资料整理

【嵌入式系统】课程复习资料整理 一、绪论 1.定义 从技术的角度定义&#xff1a;以应用为中心、以计算机技术为基础、软件硬件可裁剪、对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。从系统的角度定义&#xff1a;嵌入式系统是设计完成复杂功能的硬件和软件&a…

Android多模块开发

Android多模块开发 1. 建立项目和多个模块 ​ app为主模块 ​ app-setting为功能模块&#xff0c;可作为独立模块运行&#xff0c;也可作为其他模块的资源模块 ​ app-video为功能模块 2. 建立公共环境文件(env.gradle)并在各模块配置 Step1&#xff1a; 建立在根目录下建…

第31步 机器学习分类实战:多轮建模

开始填坑之旅。 首先&#xff0c;之前提过&#xff0c;random_state这个参数&#xff0c;它的功能是确保每次随机抽样所得到的数据都是一样的&#xff0c;有利于数据的复现。比如&#xff0c;我们这十个ML模型&#xff0c;用的参数都是random_state666&#xff0c;这样作比较才…

【写一个hello的html页面,将页面放到服务器,通过浏览器访问页面,这个过程是怎么实现的?】第一个 servlet 程序

第一个 servlet 程序 第一个 servlet 程序1. 创建项目创建好后的 默认目录 解析 2. 引入依赖为什么要引入依赖&#xff1f; 3. 创建目录结构1、在 main 目录下创建一个 webapp 目录2、在 webapp 下创建一个 WEB-INF 目录3、在 WEB-INF 目录下创建一个 web.xml 文件4、web.xml 需…

章节3:02-Apache Commons Collections反序列化漏洞

章节3&#xff1a;02-Apache Commons Collections反序列化漏洞 02-Apache Commons Collections反序列化漏洞 漏洞爆出 2015.01.28 Gabriel Lawrence和Chris Frohoff https://speakerdeck.com/frohoff/appseccali-2015-marshalling-pickles-how-deserializing-objects-can-r…

《Java虚拟机学习》 asmtools 字节码汇编器使用 与 JVM识别方法重载 的思考

1.asmtools下载 链接&#xff1a;https://pan.baidu.com/s/1R3nAaUbN1Dkf6UKkdEMSEA?pwdk8l8 提取码&#xff1a;k8l8 2.结合方法重载实验的使用 总所周知&#xff0c;方法重载跟方法名无关&#xff0c;但对于JVM而言&#xff0c;区别方法主要通过 类名&#xff0c;方法名&…

java spring MVC REST风格概念叙述

REST属于spring MVC中的一个知识点 REST是三个单词的缩写 即 Representational State Transfer 意思为 表现形式状态转换 老实说 不用尝试字面上理解 因为字面意思 确实是比较抽象 其实 意思就是 访问网络资源的格式 转换 下图 对比了 传统风格和REST风格 请求路径的差别 RES…

【英语】大学英语CET考试,阅读部分2(长篇阅读,选词填空,综合演练)

文章目录 1、长篇阅读&#xff08;连连看&#xff0c;要会做&#xff09;1.1 解题技巧&#xff08;定位词扫读&#xff0c;看到大于看懂&#xff0c;一题带练&#xff09;1.2 做题方法复习总结1.3 题目练习&#xff08;2篇文章&#xff09; 2、选词填空&#xff08;只有5分&…

opencv_c++学习(五)

Mat类数值存储方式 上图为opencv中三通道数据的存储方式&#xff0c;反映到图像上则为空间维度为3*3&#xff0c;通道为3的图像。 Mat类的属性 Mat类的属性如上&#xff0c;在这里我们解释一下step。step是行列数与数据类型的字节数相乘的数据。 Mat类元素读取 在Mat中&…

云原生: istio+dapr构建多运行时服务网格...  多运行时是一个非常新的概念。在

2020 年&#xff0c;Bilgin Ibryam 提出了 Multi-Runtime&#xff08;多运行时&#xff09;的理念&#xff0c;对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华。那到底什么是多运行时呢&#xff1f;首先还是得从分布式应用的四大类基本需求讲起。简单来讲任何分布…

【力扣周赛】第344场周赛

【力扣周赛】第344场周赛 6416&#xff1a;找出不同元素数目差数组题目描述解题思路 6417&#xff1a;频率跟踪器题目描述解题思路 6418&#xff1a;有相同颜色的相邻元素数目题目描述解题思路 6419&#xff1a;使二叉树所有路径值相等的最小代价题目描述解题思路 6416&#xf…

C++ ---- 类和对象(上)

目录 本节目标 常见问题 面向过程和面向对象的理解 什么是类如何定义类 类的引入 类的定义 类的两种定义习惯 类的作用域 类的访问限定符 访问限定符介绍 封装 封装的意义 类的实例化 类对象模型 类对象的存储方式 结构体对齐 计算类对象的大小 this指针 问题…

数青蛙​、[USACO10FEB]Chocolate Giving S

一、1419. 数青蛙 思路 这道题有俩种解法&#xff0c;一是记数&#xff0c;二是贪心 记数&#xff1a; 这是官方的题解 我们用frog_ num来表示现在正在发出蛙鸣声的青蛙数目&#xff0c;用cnt[c] 示已经发出-次有效蛙鸣中的字符c的青蛙个数,比如当cnt[c] 2时表示当前有2只…

[mini LCTF 2023] 西电的部分

感觉比赛还是很不错&#xff0c;就是有点难了&#xff0c;不过都是简单题重复更没意思。作出一道来就有一点收获。 misc1 签到题也不简单&#xff0c;已经很久不作misc了&#xff0c;感觉这东西需要安的东西太多&#xff0c;怕机子累坏了。 一个复合的wav声音文件&#xff0…