返回顶部
首页 > 资讯 > 数据库 >MySQL最常问的10道面试题(2023详解版)
  • 857
分享到

MySQL最常问的10道面试题(2023详解版)

javamysql数据库 2023-08-31 06:08:57 857人浏览 安东尼
摘要

1.什么是聚集索引和非聚集索引         简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。 由于在InnoDB引擎里面,一张表的数据对应的物理文件本身就是按照B+树来组织的一种索

1.什么是聚集索引和非聚集索引

        简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。

  1. 由于在InnoDB引擎里面,一张表的数据对应的物理文件本身就是按照B+树来组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗B+树,然后叶子节点里面存储了这个表的每一行数据记录。
  2. 所以基于InnoDB这样的特性,聚集索引并不仅仅是一种索引类型,还代表着一种数据的存储方式。
  3. 同时也意味着每个表里面必须要有一个主键,如果没有主键,InnoDB会默认选择或者添加一个隐藏列作为主键索引来存储这个表的数据行。一般情况是建议使用自增id作为主键,这样的话id本身具有连续性使得对应的数据也会按照顺序存储在磁盘上,写入性能和检索性能都很高。否则,如果使用uuid这种随机id,那么在频繁插入数据的时候,就会导致随机磁盘io,从而导致性能较低。
  4. 需要注意的是,InnoDB里面只能存在一个聚集索引,原因很简单,如果存在多个聚集索引,那么意味着这个表里面的数据存在多个副本,造成磁盘空间的浪费,以及数据维护的困难。
  5. (如图)由于在InnoDB里面,主键索引表示的是一种数据存储结构,所以如果是基于非聚集索引来查询一条完整的记录,最终还是需要访问主键索引来检索。


2.请你简单说一下Mysql事务隔离级别

事务隔离级别,是为了解决多个并行事务竞争导致的数据安全问题的一种规范。

具体来说,多个事务竞争可能会产生三种不同的现象。

1.(如图)假设有两个事务T1/T2同时在执行,T1事务有可能会读取到T2事务未提交的数据,但是未提交的事务T2可能会回滚,也就导致了T1事务读取到最终不一定存在的数据产生脏读的现象。

2.(如图)假设有两个事务T1/T2同时执行,事务T1在不同的时刻读取同一行数据的时候结果可能不一样,从而导致不可重复读的问题。

3.(如图),假设有两个事务T1/T2同时执行,事务T1执行范围查询或者范围修改的过程中,事务T2插入了一条属于事务T1范围内的数据并且提交了,这时候在事务T1查询发现多出来了一条数据,或者在T1事务发现这条数据没有被修改,看起来像是产生了幻觉,这种现象称为幻读。

 

而这三种现象在实际应用中,可能有些场景不能接受某些现象的存在,所以在sql标准中定义了四种隔离级别,分别是:

  1. 读未提交,在这种隔离级别下,可能会产生脏读、不可重复读、幻读。
  2. 读已提交(RC),在这种隔离级别下,可能会产生不可重复读和幻读。
  3. 可重复读(RR),在这种隔离级别下,可能会产生幻读
  4. 串行化,在这种隔离级别下,多个并行事务串行化执行,不会产生安全性问题。

这四种隔离级别里面,只有串行化解决了全部的问题,但也意味着这种隔离级别的性能是最低的。


 

3.mvcC的理解

对于MVCC的理解,我觉得可以先从数据库的三种并发场景说起:

第一种:读读

就是线程A与线程B同时在进行读操作,这种情况下不会出现任何并发问题。

第二种:读写  

就是线程A与线程B在同一时刻分别进行读和写操作。

这种情况下,可能会对数据库中的数据造成以下问题:

  1. 事物隔离性问题,
  2. 出现脏读,幻读,不可重复读的问题

第三种:写写

就是线程A与线程B同时进行写操作

这种情况下可能会存在数据更新丢失的问题。

而MVCC就是为了解决事务操作中并发安全性问题的无并发控制技术全称为Multi-Version Concurrency Control ,也就是多版本并发控制。它是通过数据库记录中的隐式字段,undo日志 ,Read View 来实现的。

 MVCC主要解决了三个问题

  1. 第一个是:通过MVCC 可以解决读写并发阻塞问题从而提升数据并发处理能力
  2. 第二个是:MVCC 采用了乐观锁的方式实现,降低了死锁的概率
  3. 第三个是:解决了一致性读的问题也就是事务启动时根据某个条件读取到的数据,直到事务结束时,再次执行相同条件,还是读到同一份数据,不会发生变化。

而我们在使用MVCC时一般会根据业务场景来选择组合搭配乐观锁或悲观锁。

这两个组合中,MVCC用来解决读写冲突,乐观锁或者悲观锁解决写写冲突从而最大程度的提高数据库并发性能。


4.日常工作中是怎么优化SQL

  1. 加索引,增加索引是一种简单高效的手段,但是需要选择合适的列,同时避免导致索引失效的操作,比如like、函数等。
  2. 避免返回不必要的数据列,减少返回的数据列可以增加查询的效率。
  3. 根据查询分析器适当优化SQL的结构,比如是否走全表扫描、避免子查询等
  4. 分库分表,在单表数据量较大或者并发连接数过高的情况下,通过这种方式可以有效提升查询效率
  5. 读写分离,针对读多写少的场景,这样可以保证写操作的数据库承受更小的压力,也可以缓解独占锁和共享锁的竞争。

5.mysql为什么使用B+Tree作为索引结构

首先,常规的数据库存储引擎,一般都是采用B树或者B+树来实现索引的存储。

(如图)因为B树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二叉树来说,会矮很多。

而对于数据库来说,所有的数据必然都是存储在磁盘上的,而磁盘IO的效率实际上是很低的,特别是在随机磁盘IO的情况下效率更低。

所以树的高度能够决定磁盘IO的次数,磁盘IO次数越少,对于性能的提升就越大,这也是为什么采用B树作为索引存储结构的原因。

(如图)但是在Mysql的InnoDB存储引擎里面,它用了一种增强的B树结构,也就是B+树来作为索引和数据的存储结构。

相比较于B树结构,B+树做了几个方面的优化。

  1. B+树的所有数据都存储在叶子节点,非叶子节点只存储索引。
  2. 叶子节点中的数据使用双向链表的方式进行关联。

 

使用B+树来实现索引的原因,我认为有几个方面。

  1. B+树非叶子节点不存储数据,所以每一层能够存储的索引数量会增加,意味着B+树在层高相同的情况下存储的数据量要比B树要多,使得磁盘IO次数更少。
  2. 在Mysql里面,范围查询是一个比较常用的操作,而B+树的所有存储在叶子节点的数据使用了双向链表来关联,所以在查询的时候只需查两个节点进行遍历就行,而B树需要获取所有节点,所以B+树在范围查询上效率更高。
  3. 在数据检索方面,由于所有的数据都存储在叶子节点,所以B+树的IO次数会更加稳定一些。
  4. 因为叶子节点存储所有数据,所以B+树的全局扫描能力更强一些,因为它只需要扫描叶子节点。但是B树需要遍历整个树。

另外,基于B+树这样一种结构,如果采用自增的整型数据作为主键,还能更好的避免增加数据的时候,带来叶子节点分裂导致的大量运算的问题。

总结

技术方案的选型,更多的是去解决当前场景下的特定问题,并不一定是说B+树就是最好的选择,就像mongoDB里面采用B树结构,本质上来说,其实是关系型数据库和非关系型数据库的差异。


6.Mysql索引的优点和缺点? 

索引,是一种能够帮助Mysql高效从磁盘上检索数据的一种数据结构

在Mysql中的InnoDB引擎中,采用了B+树的结构来实现索引和数据的存储

Mysql里面的索引的优点有很多

  1. 通过B+树的结构来存储数据,可以大大减少数据检索时的磁盘IO次数,从而提升数据查询的性能
  2. B+树索引在进行范围查找的时候,只需要找到起始节点,然后基于叶子节点的链表结构往下读取即可,查询效率较高。
  3. 通过唯一索引约束,可以保证数据表中每一行数据的唯一性

当然,索引的不合理使用,也会有带来很多的缺点。

  1. 数据的增加、修改、删除,需要涉及到索引的维护,当数据量较大的情况下,索引的维护会带来较大的性能开销。
  2. 一个表中允许存在一个聚簇索引和多个非聚簇索引,但是索引数不能创建太多,否则造成的索引维护成本过高。
  3. 创建索引的时候,需要考虑到索引字段值的分散性,如果字段的重复数据过多,创建索引反而会带来性能降低。

7.索引什么时候失效?

1.在索引列上做运算,比如使用函数,Mysql在生成执行计划的时候,它是根据统计信息来判断是否要使用索引的。

        而在索引列上加函数运算,导致Mysql无法识别索引列,也就不会再走索引了。

        不过从Mysql8开始,增加了函数索引可以解决这个问题。

2.在一个由多列构成的组合索引中,需要按照最左匹配法则,也就是从索引的最左列开始顺序检索,否则不会走索引。

在组合索引中,索引的存储结构是按照索引列的顺序来存储的,因此在sql中也需要按照这个顺序才能进行逐一匹配。

否则InnoDB无法识别索引导致索引失效。

3.当索引列存在隐式转化的时候, 比如索引列是字符串类型,但是在sql查询中没有使用引号。

那么Mysql会自动进行类型转化,从而导致索引失效

4.在索引列使用不等于号、not查询的时候,由于索引数据的检索效率非常低,因此Mysql引擎会判断不走索引。

5.使用like通配符匹配后缀%xxx的时候,由于这种方式不符合索引的最左匹配原则,所以也不会走索引。

但是反过来,如果通配符匹配的是前缀xxx%,符合最左匹配,也会走索引。

6.使用or连接查询的时候,or语句前后没有同时使用索引,那么索引会失效。只有or左右查询字段都是索引列的时候,才会生效。

除了这些场景以外,对于多表连接查询的场景中,连接顺序也会影响索引的使用。

不过最终是否走索引,我们可以使用explain命令来查看sql的执行计划,然后针对性的进行调优即可。


 

8. InnoDB 与MyISAM 有什么区别

  1. 事务支持不同,InnoDB 支持事务处理,而 MyISAM 不支持。
  2. 并发处理不同:InnoDB 支持行级锁,而 MyISAM 支持表级锁
  3. 外键支持不同:InnoDB 支持外键约束,而 MyISAM 不支持
  4. 性能上存在差异:MyISAM 的读取速度比 InnoDB 快,但是在高并发环境下,InnoDB 的性能更好。这是因为 InnoDB 支持行级锁和事务处理,而 MyISAM 不支持。

所以,如果是读多写少的情况下,使用MyISAM引擎会更合适

    5.数据安全不同:InnoDB 支持崩溃恢复和数据恢复,而 MyISAM 不支持。如果 MySQL 崩溃了或者发生意外故障,InnoDB 可以通过恢复日志来恢复数据。


9.为什么 SQL 语句不要过多的 join?

  1. 性能问题:每个 join 操作都需要对两个或多个表进行连接操作,这个操作需要消耗大量的计算资源和时间,如果 join 操作过多,会导致 SQL 的执行效率降低,从而影响整个系统的性能。
  2. 可读性和维护性问题:join 操作会使 SQL 语句变得复杂,难以理解和维护,特别是当 join 操作涉及到多个表的时候,SQL 语句的复杂度会呈现指数级增长,给代码的可读性和可维护性带来挑战。

10.binlog和redolog有什么区别?

binlog和redolog都是Mysql里面用来记录数据库数据变更操作的日志。

{如图}其中binlog主要用来做数据备份、数据恢复和数据同步,大家初步接触这个概念 ,应该是在Mysql的主从数据同步的场景中,master节点的数据变更,会写入到binlog中,然后再把binlog中的数据通过网络传输给slave节点,实现数据同步。

问题答案

binlog和redolog的区别有很多,我可以简单总结三个点

  1. 使用场景不同,binlog主要用来做数据备份、数据恢复、以及主从集群的数据同步; Redo Log主要用来实现Mysql数据库的事务恢复,保证事务的ACID特性。当数据库出现崩溃的时候,Redo Log可以把未提交的事务回滚,把已提交的事务进行持久化,从而保证数据的一致性和持久性。
  2. 记录的信息不同,binlog是记录数据库的逻辑变化,它提供了三种日志格式分别是statement,row以及mixed

redo log记录的是物理变化,也就是数据页的变化结果。

  1. 记录的时机不同, binlog是在执行SQL语句的时候,在主线程中生成逻辑变化写入到磁盘中,所以它是语句级别的记录方式; RedoLog是在InnoDB存储引擎层面的操作,它是在Mysql后台线程中生成并写入到磁盘中的,所以它是事务级别的记录方式,一个事务操作完成以后才会被写入到redo log中。

 粉丝福利(非常重要!!)

最新2023整理收集的一些高频面试题都整理成一个文档),有很多干货,包含mysql,Nettyspring,线程,spring cloudJVM源码算法等详细讲解(大概50w字左右),也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友点赞+关注后私信回复《578》即可免费获取!

 

来源地址:https://blog.csdn.net/weixin_46781683/article/details/130992651

您可能感兴趣的文档:

--结束END--

本文标题: MySQL最常问的10道面试题(2023详解版)

本文链接: https://lsjlt.com/news/384281.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL最常问的10道面试题(2023详解版)
    1.什么是聚集索引和非聚集索引         简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。 由于在InnoDB引擎里面,一张表的数据对应的物理文件本身就是按照B+树来组织的一种索...
    99+
    2023-08-31
    java mysql 数据库
  • Spring常见面试题55道(附答案2023最新版)
    1、什么是 Spring 框架,它的优点是什么?它的主要功能是什么? Spring 框架是一个开源的 Java 框架,主要用于开发企业级 Java 应用程序。它提供了一组强大的功能和工具,使得开发者能够更加容易地构建高效、可维护和可扩展的 ...
    99+
    2023-08-18
    spring java 后端
  • MySQL常见面试题(2023年最新)
    目录 前言1.char和varchar的区别2.数据库的三大范式3.你了解sql的执行顺序吗?4.索引是什么5.索引的优点和缺点6.索引的类型7.索引怎么设计(优化)8.怎么避免索引失效(也属于sql优化的一种)9.索引的数据类型1...
    99+
    2023-08-16
    mysql 数据库 java 面试 最新
  • 十道Python面试最常问到的问题
    Python基础面试题 1、 Python 数据结构有哪些 整数(int)浮点(float)字符串(str)布尔(bool)列表(list)元组(tuple)字典(dict)集合(s...
    99+
    2023-05-15
    Python面试 Python常见面试题
  • 【2023最新版】Spring Cloud面试题总结(35道题含答案解析)
    文章目录 1、什么是Spring Cloud? 2、使用Spring Cloud有什么优势? 3、服务注册和发现是什么意思?Spring Cloud如何实现? 4、负载平衡的意义什么? 5、什么是Hystrix?它如何实现容错? 6、什么是...
    99+
    2023-08-24
    java springcloud 程序员 编程 找工作
  • Linux面试中最常问的10个问题总结
    前言 如果你要去面试一个linux系统运维工程师的职位,下面这十个最常见的问题一定要会,否则你的面试可能就危险了。这些都是比较基本的问题,大家要理解,不能光死记硬背。 1、如何查看系统内核的版本 这里有两种方法: 1) ...
    99+
    2022-06-04
    linux面试问题 linux面试常问命令 面试官常问的linux命令
  • Java常见的10道面试题是什么
    这篇文章主要讲解了“Java常见的10道面试题是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java常见的10道面试题是什么”吧!什么是并发修改异常什么是并发修改异常:当我们在遍历实现...
    99+
    2023-06-02
  • 2023年Java最新面试题,附详解答案
    写在前面:本篇面试题整理是我在广州地区进行面试整理得出,常见的基本都在下面了。基本都是可以直接在面试时用白话回答的答案总结,面试时照此回答即可,有其他常见面试问题也欢迎在评论区补充。 首次发布:202 3年 1月 更新日期:2023年 ...
    99+
    2023-08-16
    java 面试 jvm Java 面试
  • 2023 Android面试官 常问的问题以及答案(附最新的Android面试大厂必考174题 )
    前言 已经2023了 但是计算机的寒冬还没有过去 ,但是我们程序员的热情不会被磨灭(有钱就干 越多越有劲)。在这个金三银四的季节 许多公司也发布了更多的招聘岗位 面试机会多了 那我们跟要把握住。以下分享一些面试题给大家,希望能帮到大家找一份...
    99+
    2023-08-16
    android 面试 java
  • 最常见的MySQL面试及笔试题
    不知道大家之前对类似最常见的MySQL面试及笔试题的文章有无了解。今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完最常见的MySQL面试及笔试题你一定会有所收获的。01、MySQL...
    99+
    2024-04-02
  • 10个Python面试常问的问题分别是哪些
    10个Python面试常问的问题分别是哪些,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概述Python是个非常受欢迎的编程语言,随着近些年机器学习、云计算等技术的发展,P...
    99+
    2023-06-17
  • Python面试最常问到的问题有哪些
    本篇内容介绍了“Python面试最常问到的问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Python基础面试题1、 Python ...
    99+
    2023-07-06
  • Android常见面试题总结以及答案解析(2023年新版)
    缘起 对于Android的学习,很多⼈可能学了之后,不知道⾃⼰处于哪个阶段,也不到究竟要学到哪个程度,验证⾃⼰学得如何最好的⾯试,就是尝试去⾯试,⽽⾯试⽆⾮就是问你⼀些⾯试题。 而我之前也有整理过一些...
    99+
    2023-10-01
    android
  • NumPy 数组:Python 面试中最常见的问题解析!
    在 Python 面试中,NumPy 数组是一个经常被提及的话题。NumPy 是一个用于科学计算的 Python 库,它提供了一个高性能的多维数组对象,以及用于处理这些数组的工具。 本文将介绍 NumPy 数组的一些基本概念,以及在 Py...
    99+
    2023-08-30
    面试 数组 numy
  • 史上最详细的一线大厂Mysql面试题详解
    MySQL的复制原理以及流程基本原理流程,3个线程以及之间的关联;主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;从:io线程——在使用start slave 之后,负责从master上拉取 b...
    99+
    2023-06-05
  • Redis中一些最常见的面试问题总结
    前言 经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估计是我...
    99+
    2024-04-02
  • 最新Mysql大厂面试必会的34问题
    1、mysql的隔离级别 2、MYSQL性能优化 常用5种方式 3、索引详解 1、何为索引,有什么用? 2、索引的优缺点 4、什么情况下需要建索引? 5、什么情况下不建索引? 6、索引的底层数据结构 1、...
    99+
    2018-12-18
    最新Mysql大厂面试必会的34问题
  • 你是否知道Python文件面试中常见的问题?
    Python作为一门广泛使用的编程语言,在文件处理方面的应用也十分广泛。因此,在Python文件面试中,也有一些常见的问题值得我们了解和掌握。本文将从文件读写、文件操作、文件处理等方面为大家介绍Python文件面试中常见的问题。 一、文件读...
    99+
    2023-08-14
    文件 面试 教程
  • Spring和Unix:Java面试中最常见的问题是什么?
    在面试Java开发岗位时,经常会被问到与Spring和Unix相关的问题。这两个主题在Java开发中非常重要,因此,对于面试者来说,掌握这些知识点是至关重要的。本文将介绍Java面试中最常见的Spring和Unix相关问题,并提供演示代码...
    99+
    2023-09-16
    面试 spring unix
  • PHP文件Shell面试:如何回答最常见的问题?
    在PHP文件Shell面试中,面试官会问许多问题,这些问题可能会涉及到你的PHP基础知识、Shell编程技能、Linux操作系统知识等方面。在本篇文章中,我们将着重介绍如何回答最常见的问题。 如何在Shell中执行PHP文件? 在Sh...
    99+
    2023-05-30
    文件 shell 面试
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作