MySQL面试题汇总

常规:

1、数据库三大范式

  • 1NF : 表中字段的数据不可再拆分。(原子性)
  • 2NF : 在满足第一范式的情况下,遵循唯一性,消除部分依赖。即,表中任意一个主键或任意一组联合主键,可以确定除该主键外的所有的非主键值。(一个表只能描述一件事情)
  • 3NF : 在满足第二范式的情况下,消除传递依赖。即,在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B

参考文章 数据库三大范式

2、主键和外键的区别?

  • 主键:唯一标识一条记录。不能有重复的,不允许为空 。
  • 外键:表的外键是另一表的主键, 用于和其他表建立联系。外键可以有重复的, 可以是空值。

3、CHAR 和 VARCHAR 的区别是什么?

        两者的主要区别在于:CHAR 是定长字符串,VARCHAR 是变长字符串。

  • CHAR 更适合存储长度较短或者长度都差不多的字符串,例如 Bcrypt 算法、MD5 算法加密后的密码、身份证号码。
  • VARCHAR 类型适合存储长度不确定或者差异较大的字符串,例如用户昵称、文章标题等。

4、DECIMAL 和 FLOAT/DOUBLE 的区别是什么?

        DECIMAL 和 FLOAT 的区别是:

  • DECIMAL 是定点数,FLOAT/DOUBLE 是浮点数。
  • DECIMAL 可以存储精确的小数值,FLOAT/DOUBLE 只能存储近似的小数值。

5、NULL 和 ' ' 的区别是什么?

  • 类型:null表示的是一个对象的值,而非一个字符串,而""表示的是一个长度为0的空字符串。
  • 内存分配:null不分配内存空间;而""会分配内存空间。 如:
    • String aaa = null ;                                                                                                              表示声明一个字符串对象的引用,但指向为null(未指向任何的内存空间);
    • String bbb = "";
      表示声明一个字符串类型的引用,其值为""空字符串(指向空字符串的内存空间);
  • 查询 NULL 值时,必须使用 IS NULL 或 IS NOT NULLl 来判断,而不能使用 =、!=、 <、> 之类的比较运算符。而''是可以使用这些比较运算符的。

6、Boolean 类型如何表示?

        MySQL 中没有专门的布尔类型,而是用 TINYINT(1) 类型来表示布尔值。TINYINT(1) 类型可以存储 0 或 1,分别对应 false 或 true。

7、MySQL 基础架构及执行过程

  • 连接器: 身份认证和权限相关(登录 MySQL 的时候)。
  • 查询缓存: 执行查询语句的时候,会先查询缓存(MySQL 8.0 版本后移除)。
  • 分析器: 没有命中缓存的话,SQL 语句就会经过分析器,分析器说白了就是要先看你的 SQL 语句要干嘛,再检查你的 SQL 语句语法是否正确。
  • 优化器: 按照 MySQL 认为最优的方案去执行。
  • 执行器: 执行语句,然后从存储引擎返回数据。 执行语句之前会先判断是否有权限,如果没有权限的话,就会报错。
  • 插件式存储引擎:主要负责数据的存储和读取,采用的是插件式架构,支持 InnoDB、MyISAM、Memory 等多种存储引擎。

8、MySQL 存储引擎MyISAM 和 InnoDB 有什么区别?

        MySQL 存储引擎采用的是 插件式架构 ,支持多种存储引擎,我们甚至可以为不同的数据库表设置不同的存储引擎以适应不同场景的需要。存储引擎是基于表的,而不是数据库。

        MySQL 5.5 版本之后,InnoDB 是 MySQL 的默认存储引擎,之前默认存储引擎是MyISAM,两者区别如下:

  • InnoDB 支持行级别的锁粒度,MyISAM 不支持,只支持表级别的锁粒度。
  • MyISAM 不提供事务支持。InnoDB 提供事务支持,实现了 SQL 标准定义了四个隔离级别。
    • InnoDB 默认使用的 REPEATABLE-READ(可重读)隔离级别,并可以解决幻读问题(基于 MVCC 和 Next-Key Lock)。
  • MyISAM 不支持外键,而 InnoDB 支持。
  • MyISAM 不支持 MVCC,而 InnoDB 支持。
  • MyISAM 和 InnoDB 都使用 B+Tree 作为索引结构,但是两者的实现方式不太一样。
  • MyISAM 不支持数据库异常崩溃后的安全恢复,而 InnoDB 支持。
  • InnoDB 的性能比 MyISAM 更强大。

9、事务的四大特性

  • 原子性(Atomicity):事务是一个不可分割的工作单位,事务内的操作要么全部执行成功,要么全部回滚。

  • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

  • 隔离性(Isolation):一个事务所做的修改操作在提交之前,对于其他事务来说是不可见的。

  • 持久性(Durability):事务一旦被提交,它对数据库中数据的改变就是永久性的。

        redo log保证了持久性,undo log保证了原子性和一致性,锁和MVCC机制保证了隔离性。

10、MySQL事务隔离级别

        据库事务隔离级别分为四个等级,分别为:读未提交read-uncommitted)、读已提交(read committed)、可重复读(repeatable read)、串行序列化(serializable)。

事务隔离要实际解决的问题:

  • 脏读:读了其他事务未提交的数据。
  • 不可重复读:同一事务先后读取同一条记录,但两次读取的数据不同。
  • 幻读:在一个事务中,按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在。

        InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的,主要有下面两种情况:

  • 快照读:由 MVCC 机制来保证不出现幻读。
  • 当前读:使用 Next-Key Lock 进行加锁来保证不出现幻读,Next-Key Lock 是行锁(Record Lock)和间隙锁(Gap Lock)的结合,行锁只能锁住已经存在的行,为了避免插入新行,需要依赖间隙锁。

11、undo log和redo log的区别 ?

  • redo log(重做日志):是为了系统崩溃之后恢复数据用的,让数据库照着日志,把没做好的事情重做一遍。 
  • undo log(回滚日志):用于记录被修改前的信息,记录的是逻辑日志,作用:提供事务回滚和MVCC。
  • redo log保证了事务的持久性,undo log保证了事务的原子性和一致性。

12、事务中的隔离性是如何保证的呢?

        事务的隔离性是由锁和mvcc实现的。

        mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要分为三个部分:
  • 隐藏字段
    • trx_id(事务id):记录每一次操作的事务id,是自增的。
    • roll_pointer(回滚指针):指向上一个事务版本的地址。
  • undo log:
    • 回滚日志,存储老版本数据,形成一条版本链。
    • 版本链:多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表。
  • readView解决的是一个事务查询选择版本的问题。
    • 根据readView的匹配规则和当前的一些事务id判断该访问哪个版本的数据。
    • 不同的隔离级别快照读也不一样,最终的访问的结果不一样:
      • RC(读已提交) :每一次执行快照读时生成ReadView。
      • RR(可重复读):仅在事务中第一次执行快照读时生成ReadView,后续复用。

13、MySQL主从同步原理

        MySQL主从复制的核心就是二进制日志(binlog),里面记录了所有DDLDML语句。

  • 主库在事务提交时,会将数据变更记录在binlog中。
  • 从库读取主库的binlog,写入从库的中继日志Relay log中。
  • 从库读取中继日志,写入到自己的数据库中。

14、MySQL分库分表

  • 水平分库:将一个库的数据拆分到多个库中,解决海量数据存储和高并发的问题。
  • 水平分表:解决单表存储和性能的问题。
  • 垂直分库:根据业务进行拆分,高并发下提高磁盘IO和网络连接数。
  • 垂直分表:冷热数据分离,多表互不影响。

索引:

        索引是一种用于快速查询和检索数据的数据结构,本质可以看成是一种排序好的数据结构。

索引的优缺点:

  • 优点:大大加快 数据的检索速度,降低数据库的IO成本。
  • 缺点:创建索引和维护索引需要耗费大量时间,索引的存储也需要消耗一定的空间。

1、索引的底层数据结构选型

        索引底层数据结构存在很多种类型,常见的索引结构有: B 树, B+树 和 Hash、红黑树。在 MySQL 中,无论是 Innodb 还是 MyIsam,都使用了 B+树作为索引结构

        下面分别介绍几种索引结构以及为什么要选择B+树做索引结构。

  • 哈希表是键值对的集合,通过key可以快速地检索到对应的值,因此哈希表可以快速检索数据。然而,因为hash索引是精确查找,不支持范围查询,因此不使用hash作为索引结构。
  • AVL树(平衡二叉查找树)解决了二叉查找树最坏情形退化成链表的情况,但是需要不断地旋转操作来保持树地平衡,I/O磁盘操作次数较多。
  • 红黑树不和AVL树一样追求绝对平衡,只追求大致平衡,但因此红黑树的高度也会较高,检索数据时也需要较多的IO磁盘。
  • B树,全称多路平衡查找树B+ 树是 B 树的一种变体,二者区别如下:
    • B 树的所有节点既存放键(key) 也存放数据(data),而 B+树只有叶子节点存放 key 和 data,其他节点只存放 key,相当于索引。
    • B 树的叶子节点都是独立的;B+树的叶子节点有一条引用链指向与它相邻的叶子节点。
    • B+树与 B 树相比,具备更少的 IO 次数、更稳定的查询效率和更适于范围查询这些优势。

        选用B+树的主要原因:

  • 阶数更多,路径更短。
  • 磁盘读写代价 更低,非叶子节点只存储指针,叶子节点存储数据。
  • B+ 树便于扫库和区间查询,叶子节点是一个双向链表。

2、MySQL中,如何定位慢查询?

       MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中。

3、那这个SQL语句执行很慢, 如何分析呢?

        可以使用MySQL自带的explain来查看这条SQL语句的执行计划,如下图:

可以从以下三个方面进行分析:

  • 通过keykey_len检查是否命中了索引。
  • 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描。
    • type 性能由好到差为:
    • system:查询系统中的表。
    • const:根据主键查询。
    • eq ref:主键索引查询或唯一索引查询。
    • ref:索引查询。
    • range:范围查询。
    • index:全索引扫描。
    • all:全盘扫描。
  • 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复。

4、什么是聚簇索引什么是非聚簇索引 ?

  • 聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个,一般是主键索引。
  • 非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个。

5、什么是回表查询?

        通过二级索引找到对应的主键值,再通过主键值到聚集索引中查找整行数据的过程。

6、什么是覆盖索引?

        覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。

  • 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
  • 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *

7、MYSQL超大分页怎么处理 ?

        超大分页一般都是在数据量比较大时,我们使用了limit 分页查询,并且需要对数据进行排序,这个时候效率就很低,我们可以采用覆盖索引和子查询来解决:
  • 先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了。  由于查询id的时候走的覆盖索引,效率相对较高。                                                                                                                                                                                           

8、索引创建原则有哪些?

  • 针对数据量较大,且查询比较频繁的表。(10w数据量)
  • 针对常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。
  • 尽量使用联合索引,避免回表,提升效率。
  • 控制索引的数量,索引越多,维护索引的成本越高,会影响到增删改的效率。
  • 尽量选择区分度高的列作为索引。
  • 如果是字符串类型的字段作为索引,且字段较长,建立前缀索引。
  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。

9、什么情况下索引会失效 ?

  • 违反最左前缀法则。(主要针对联合索引)
  • 范围查询右边的列,不能使用索引 。
  • 索引列上进行运算操作, 索引将失效。
  • 字符串不加单引号,造成索引失效。(发生了类型转换)
  • 以%开头的Like模糊查询,索引失效。(%结尾不会失效)

10、谈一谈你对sql的优化的经验

  • 表的设计优化。
    • 如设置合适的数值类型(int、bigint、tinyint),字符串类型(char、varchar)
  • 索引优化:索引创建原则、避免索引失效。
    • 见以上第8、9点。
  • SQL语句优化。
    • 如:select语句指明具体字段,尽量避免使用select * ,防止回表查询。
    • SQL语句尽量避免造成索引失效的写法。
    • 尽量用union all代替union,union会去重,多一次过滤操作,效率低。
    • Join优化 能用inner join 就不用left join right join,如必须使用 一定要以小表为驱动。
  • 主从复制、读写分离。
    • 数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响 可以采用读写分离的架构。
  • 分库分表。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(适趣AI)Vue笔试题

&#x1f4d1;前言 本文主要是【Vue】——&#xff08;适趣AI&#xff09;Vue笔试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …

Android studio报错误提示 Some Kotlin libraries attached to this project 问题解决方案

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 Android新建项目后&#xff0c;报以下错误 错误提示内容为&#xff1a; 这个项目附带的一…

pygame学习(二)——绘制线条、圆、矩形等图案

导语 pygame是一个跨平台Python库(pygame news)&#xff0c;专门用来开发游戏。pygame主要为开发、设计2D电子游戏而生&#xff0c;提供图像模块&#xff08;image&#xff09;、声音模块&#xff08;mixer&#xff09;、输入/输出&#xff08;鼠标、键盘、显示屏&#xff09;模…

Spring Boot 与 Spring 框架的区别

一、前言 Spring Boot 和 Spring 框架是由 Spring 项目提供的两个关键的技术栈&#xff0c;它们在 Java 开发中扮演着不同的角色。在阐述其区别之前&#xff0c;我们先大致了解下这两个框架 二、Spring 框架 1、背景 Spring 框架是一个全栈的企业应用开发框架&#xff0c;起…

营销的尽头是矩阵!如何通过小魔推短视频矩阵快速破圈?

“ 营销的尽头是矩阵&#xff01; 相信很多做互联网的朋友都听过这么一句话 在抖音上我们看到过大批的博主&#xff0c;都是通过矩阵的方式火遍全网&#xff0c;就比如张琦、小杨哥等等&#xff0c;矩阵的方式适用于大多数的实体品牌&#xff0c;以及个人IP 等&#xff0c…

DevOps(3)

目录 11.描述root账户&#xff1f; 12.如何在发出命令时打开命令提示符&#xff1f; 14.Linux系统下交换分区的典型大小是多少&#xff1f; 15.什么是符号链接&#xff1f; 11.描述root账户&#xff1f; root账户就像一个系统管理员账户&#xff0c;允许你完全控制系统。 …

目标跟踪算法中的卡尔曼滤波学习

在使用多目标跟踪算法时&#xff0c;接触到卡尔曼滤波&#xff0c;一直没时间总结下&#xff0c;现在来填坑。 1. 背景知识 在理解卡尔曼滤波前&#xff0c;有几个概念值得考虑下&#xff1a;时序序列模型&#xff0c;滤波&#xff0c;线性动态系统 1. 时间序列模型 时间序…

AspectJ入门(二)— 应用

AspectJ便于调试、测试和性能调整工作。定义的行为范围从简单的跟踪到分析&#xff0c;再到应用程序内部一致性到测试。AspectJ可以干净地模块化这类功能&#xff0c;从而可以在需要时轻松地启用和禁用这些功能。 1 基础 本节将继续介绍AspectJ到一些基础功能&#xff0c;为后…

负载均衡案例:如何只用2GB内存统计20亿个整数中出现次数最多的整数

基于python实现。 如果是常规的小型文件&#xff0c;我们可以迅速地想到要建立字典。 以数字为key&#xff0c;以数字的出现次数为value&#xff0c;建立<int,int>类型的键值对存入字典&#xff0c;然后使用 max 函数结合字典的 items 方法来找到一个字典中 value 最大的…

2023 波卡年度报告选读:Polkadot SDK 与开发者社区

原文&#xff1a;https://dashboards.data.paritytech.io/reports/2023/index.html#section6 编译&#xff1a;OneBlock 编者注&#xff1a;Parity 数据团队发布的 2023 年 Polkadot 年度数据报告&#xff0c;对推动生态系统的关键数据进行了深入分析。报告全文较长&#xff…

一键减低PNG像素,轻松优化图片质量!

在数字时代&#xff0c;我们每天都要处理大量的图片文件&#xff0c;从网站设计、广告素材到社交媒体图片等。PNG作为一种常用的无损压缩格式&#xff0c;在保证图片质量的同时&#xff0c;也占用了较大的存储空间。为了优化存储空间和提高加载速度&#xff0c;我们需要对PNG图…

数据结构学习笔记——查找算法中的树形查找(B树、B+树)

目录 前言一、B树&#xff08;一&#xff09;B树的概念&#xff08;二&#xff09;B树的性质&#xff08;三&#xff09;B树的高度&#xff08;四&#xff09;B树的查找&#xff08;五&#xff09;B树的插入&#xff08;六&#xff09;B树的删除 二、B树&#xff08;一&#xf…

科技助力教育:数字化如何改变家校社协同育人?

近年来,随着社会的快速发展,教育的责任已不再仅局限于学校。家庭、学校和社会协同育人理念,正成为促进教育高质量发展的关键要素。 2023年初,教育部等十三部门联合印发《关于健全学校家庭社会协同育人机制的意见》,提出到“十四五”时期末,形成更加完善的由“学校积极主导、家…

Excel如何将单元格设为文本

文章目录 一、打开excel文件二、选中单元格三、右键设置单元格格式四、设置界面选择文本后点确定五、其他问题 在caa开发过程中遇到从CATUnicodeString转成CString时&#xff0c;通过SetItemText写入将ID号写入单元格&#xff0c;无法保存ID号中的数字0&#xff0c;故将单元格格…

统信UOS_麒麟KYLINOS修改图标显示名称

原文链接&#xff1a;统信UOS/麒麟KYLINOS修改图标显示名称 hello&#xff0c;大家好啊&#xff01;今天我要给大家介绍的是在统信UOS及麒麟KYLINOS操作系统上如何修改软件的名称。这种自定义可以帮助您更快地识别和访问常用的应用程序&#xff0c;也可以使您的桌面环境更加个性…

【MATLAB】CEEMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 CEEMD-LSTM神经网络时序预测算法是一种结合了完全扩展经验模态分解&#xff08;CEEMD&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 CEEMD是一种改…

基于MyCat2.0实现MySQL分库分表方案

目录 一、MyCat概述 二、MyCat作用 2.1 数据分片 2.1.1 垂直拆分 2.1.1.1 垂直分库 2.1.1.2 垂直分表 2.1.1.3 总结 2.1.2 水平拆分 2.1.2.1 水平分库 2.1.2.2 水平分表 2.1.2.3 总结 2.2 读写分离 2.3 多数据源整合 三、MyCat 与ShardingJDBC的区别 3.1 MyCat …

易基因:ChIP-seq等揭示Runx2通过转录调控Itgav表达激活肝星状细胞以促进肝纤维化|科研进展

这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 肌成纤维细胞&#xff08;myofibroblasts&#xff09;主要由肝脏中活化的肝星状细胞(hepatic stellate cells HSC)组成&#xff0c;在肝纤维化进展中发挥着核心作用。由于肌成纤维细胞主要负责细胞外基质蛋…

代码随想录刷题第三十六天| 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

代码随想录刷题第三十六天 无重叠区间 (LC 435) 题目思路&#xff1a; 代码实现&#xff1a; class Solution:def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:intervals.sort(keylambda x: (x[0],x[1]))count 0right intervals[0][1]for i in ra…

拼题A 跨年挑战赛 2024 赛后提交入口 + 题目 + 题解

赛后也想提交&#xff1f;点击进入 拼题A教育超市 周三&#xff0c;搞学长&#xff1a;“小柳进前十了&#xff01;想要奖品过来拿&#xff01;” 等了好几天的比赛结果终于出来了&#xff0c;四年来的跨年挑战赛第一次做满分&#xff0c;第一次进前十&#xff01;&#xff0…