14、MySQL高频面试题

1、内连接和外连接的区别

内连接和外连接都是数据库进行多表联查时使用的连接方式,区别在于二者获取的数据集不同

内连接指的是使用左表中的每一条数据分别去连接右表中的每一条数据,仅仅显示出匹配成功的那部分

外连接有分为左外连接和右外连接

  • 左外连接: 首先要显示出左表的全部,然后使用连接条件匹配右表,能匹配中的就显示,匹配不中的显示为null
  • 右外连接: 首先要显示出右表的全部,然后使用连接条件匹配左表,能匹配中的就显示,匹配不中的显示为null

2、drop、delete与truncate区别

这个关键字都是MySQL中用于删除的关键字,区别在于:

  1. delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作
  2. drop 主要用于删除数据表、表中的列、索引等结构
  3. truncate 是直接把表删除,然后再重建表结构

这三种方式在效率方面drop 最高、truncate 其次、delete最低,但是drop和truncate 都不记录日志,无法回滚

3、union与union all的区别

union和union all都是MySQL中用于合并多条select语句结果的关键字,它会将前后两条select语句的结果组合到一个结果集合中

区别在于UNION ALL会返回所有结果,UNION会去掉重复的记录

4、char和varchar的区别

char和varchar是MySQL中的字符串类型,区别在于下面几方面:

  1. 最大长度:char最大长度是255字符,varchar最大长度是65535个字节
  2. 占用长度:char是定长的,不足的部分用隐藏空格填充,varchar是不定长的
  3. 空间使用:char会浪费空间,varchar会更加节省空间
  4. 查找效率:char查找效率会很高,varchar查找效率会更低

因此我们如果存储固定长度的列,例如身份证号、手机号建议使用char

其它不定长度的建议使用varchar,使用varchar的时候也要尽量让声明长度贴近实际长度

注意:varchar(50)中50的涵义是最多存放50个字符,varchar(50)和varchar(200)存储hello所占空间一样

5、事务的四大特性

事务的四大特性指的是原子性、一致性、隔离性、持久性

  • 原子性:事务是最小的执行单位,不允许分割,同一个事务中的所有命令要么全部执行,要么全部不执行
  • 一致性:事务执行前后,数据的状态要保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的
  • 隔离性:并发访问数据库时,一个事务不被其他事务所干扰,各并发事务是独立执行的
  • 持久性:一个事务一旦提交,对数据库的改变应该是永久的,即使系统发生故障也不能丢失

6、并发事务带来的问题

并发事务下,可能会产生如下的问题:

  • 脏读:一个事务读取到了另外一个事务没有提交的数据
  • 不可重复读:一个事务读取到了另外一个事务修改的数据
  • 幻读(虚读):一个事务读取到了另外一个事务新增的数据

7、事务隔离级别

事务隔离级别是用来解决并发事务问题的方案,不同的隔离级别可以解决的事务问题不一样

  • 读未提交: 允许读取尚未提交的数据,可能会导致脏读、幻读或不可重复读
  • 读已提交: 允许读取并发事务已提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
  • 可重复读: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
  • 可串行化: 所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,该级别可以防止脏读、不可重复读以及幻读。

上面的这些事务隔离级别效率依次降低,安全性依次升高,如果不单独设置,MySQL默认的隔离级别是可重复读

8、数据库三大范式

三大范式是指导设计数据库的原则

  • 第一范式:表中的每一列不能再进行拆分,也就是每一列都应该是原子的
  • 第二范式:一张表只做一件事,不要将多个层次的数据列保存到一张表中
  • 第三范式:数据不能存在传递关系,也就是说可以通过其它字段推出来的字段没必要再存储

在现有的程序设计中认为第三范式是可以不遵守的,也就是通过添加冗余字段,来减少多表联查或计算,我们称为反三范式

9、索引的分类

索引是数据库中用于提供查询效率的一种手段

  • 从物理存储角度上分为聚集索引和非聚集索引

    聚集索引指的是数据和索引存储在同一个文件中,InnoDB存储引擎使用的是此类索引存储方式

    非聚集索引指的是数据和索引存储在不同的文件中,MyISAM存储引擎使用的是此类索引存储方式

  • 从逻辑角度上分为普通、唯一、主键和联合索引,它们都可以用来提高查询效率,区别点在于

    唯一索引可以限制某列数据不出现重复,主键索引能够限制字段唯一、非空

    联合索引指的是对多个字段建立一个索引,一般是当经常使用某几个字段查询时才会使用,它比对这几个列单独建立索引效率要高

10、索引的创建原则

索引可以大幅度提高查询的效率,但不是所有的字段都要加,也不是加的越多越好,因为索引会占据磁盘空间,也会影响增删改的效率

我们在建立索引的时候应该遵循下面这些原则:

  1. 主键字段、外键字段应该添加索引
  2. 经常作为查询条件、排序条件或分组条件的字段需要建立索引
  3. 经常使用聚合函数进行统计的列可以建立索引
  4. 经常使用多个条件查询时建议使用组合索引代替多个单列索引

除此之外,下面这些情况,不应该建立索引

  1. 数据量小的表不建议添加索引
  2. 数据类型的字段是TEXT、BLOB、BIT等数据类型的字段不建议建索引
  3. 不要在区分度低的字段建立索引,比如性别字段、年龄字段等

11、索引失效的情况

索引失效指的是虽然在查询的列上添加了索引,但是某些情况下,查询的时候依旧没有用到索引,常见的情况有

  1. 使用like关键字时,模糊匹配使用%开头将导致索引失效
  2. 使用连接条件时,如果条件中存在没有索引的列会导致索引失效
  3. 在索引列上进行计算、函数运算、类型转换将导致索引失效
  4. 使用 !=、not in、is null、is not null时会导致索引失效
  5. 使用联合索引时,没有遵循最左匹配原则会导致索引失效

12、如何知道索引是否失效

MySQL中自带了一个关键字叫explain,它可以加在一个sql的前面来查看这条sql的执行计划

在执行计划中,我们主要观察两列的结果,一列是type,一列是extra

第一个type是重要的列,显示本次查询使用了何种类型,常见的值从坏到好依次为:all、index、range、ref、eq_ref 、const、system

  • all表示全表扫描数据文件返回符合要求的记录
  • index表示全表扫描索引文件返回符合要求的记录
  • range表示检索指定范围的行,常见于使用>,<,between,in,like等运算符的查询中
  • ref表示两表查询时,驱动表可能返回多行数据,也就是查询条件在主表中是加了一个普通索引
  • eq_ref表示两表查询时,驱动表只返回一行数据,也就是查询条件在主表中是唯一的
  • const表示索引一次就能得到结果,一般是使用唯一索引或者主键作为查询条件
  • system表示表中仅有一行数据,很少见到

我们在优化的时候尽量优化到range级别以上

除了type之外我们需要关注一下extra列,它表示执行状态说明

  • 要保证此列不要出现using filesort、using temporary等使用临时表或外部文件的情况

  • 如果出现using index最好了,它表示列数据仅仅使用了索引中的信息而没有回表查询

13、MyISAM和InnoDB的区别

MyISAM和InnoDB是目前MySQL中最为流行的两种存储引擎,它们的区别有这几方面:

  1. MyISAM不支持事务,每次操作都是原子的;InnoDB支持事务,支持事务的四种隔离级别
  2. MyISAM不支持外键,InnoDB支持外键
  3. MyISAM仅仅支持表级锁,即每次操作是对整个表加锁;InnoDB支持行级锁,因此可以支持写并发
  4. MyISAM属于非聚集性索引,它的数据和索引不在同一个文件中;InnoDB属于聚集性索引,它的数据和索引在同一个文件中
  5. MyISAM中主键和非主键索引的数据部分都是存储的文件的指针;InnoDB主键索引的数据部分存储的是表记录,非主键索引的数据部分存储的是主键值

14、查询语句执行流程

在这里插入图片描述

一条查询语句到达MySQL数据库之后,数据库中的各个组件会按照顺序执行自己的任务

  1. 首先是连接器,他会负责建立连接、检查权限等操作
  2. 连接成功之后,会查询缓存,如果缓存中有结果会直接返回;如果缓存中没有结果,会将sql交给分析器处理
  3. 分析器负责检查sql的词法、语法,如果没有问题,再将sql交给优化器处理
  4. 优化器会决定用哪个索引,决定表的连接顺序等,然后将优化之后的sql交给执行器
  5. 执行器根据存储引擎类型,调用存储引擎接口
  6. 存储引擎负责最后数据的读写

15、索引的数据结构是什么

在MySQL中索引使用的数据结构是B+Tree,B+树是基于B树的变种,它具有B树的平衡性,而且树的高度更低

  • B+树非叶子节点不存在数据只存索引,因此其内部节点相对B树更小,树的高度更小,查询产生的I/O更少
  • B+树查询效率更高,B+树使用双向链表串连所有叶子节点,区间查询效率更高
  • B+树查询效率更稳定,B+树每次都必须查询到叶子节点才能找到数据,而B树查询的数据可能不在叶子节点,也可能在,这样就会造成查询的效率的不稳定

16、数据库中的锁有哪些

MySQL中的锁从不同维度可以分为不同的种类

  1. 从锁的粒度上可以分为表锁和行锁

    表锁指的是会锁定修改数据所在的整个表,开销小,加锁快,锁定粒度大,发生锁冲突概率高

    行锁指的是会锁定修改数据所在的行记录,开销大,加锁慢,锁定粒度小,发生锁冲突概率低

  2. 从锁的排他性上分为共享锁和排他锁

    共享锁指的是当一个事务针对同一份数据加上共享锁之后,另一个事务也可以再往上加一把共享锁,也可以读数据,但是不能改

    对索引列加共享锁,锁定的是一行数据;对非索引列加共享锁,锁定的是整表数据

    排他锁指的的是当一个事务针对同一份数据加上排他锁之后,另一个事务只能读数据,不能改,也不能再上其它任务锁

  3. 还有两种概念上的锁是悲观锁和乐观锁

    悲观锁是指一个事务在修改数据的时候,总是认为别人也会修改此数据,所以强制要使用锁来保证数据安全

    乐观锁是指一个事务在修改数据的时候,总是认为别人不会修改此数据,因为不加任何锁

    这种情况下万一在当前事务修改的时候,数据被其它事务也修改了,机会出现问题,此时常用的方案是:

    给数据表中添加一个version列,每次更新后都将这个列的值加1,读取数据时,将版本号读取出来

    在执行更新的时候,会先比较版本号,如果相同则执行更新,如果不相同,说明此条数据已经发生了变化,就放弃更新或重试

17、MySQL日志类型

MySQL的很多功能都是依靠日志来实现的,比如事务回滚,数据备份,主从复制等等,常见的日志有下面几个

  1. binlog归档日志

    负责记录对数据库的写操作,一般用在主从复制过程中记录日志,从库拷贝此日志做重放实现数据同步

  2. redolog重做日志

    用于确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘

    在重启 mysql 服务的时候,根据 redo log 进行重做,从而达到事务的持久性这一特性

  3. undo log 回滚日志

    保存了事务发生之前的数据的一个版本,可以用于回滚

18、MySQL主从复制的流程

主从复制用于MySQL主从集群的主节点向从节点同步数据,主要是依靠MySQL的binLog实现的,大体流程分为三步:

  1. Master 主库在事务提交时,会把数据变更记录在二进制日志文件 BinLog中
  2. 从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 RelayLog
  3. slave重做中继日志中的事件,将改变反映它自己的数据

在这里插入图片描述

19、谈谈你对sql的优化的经验

我在企业中优化Sql大体分为三步:

  1. 查找问题sql,主要手段是开启mysql的慢查询日志,它会将执行时间较长的sql记录记录下来
  2. 找到sql之后,我会分析出现问题的原因,原因很多,主要字段类型选择错误、sql语句效率低、索引失效等等
  3. 根据问题不同,我会再去定具体的解决方案

简单给您说几个常见的把

  1. 确定选择的引擎是否合适

    myisam适合于查询为主,增删较少,无事务要求的数据表

    Innodb适用于有事务处理,或者包括很多的更新和删除的数据表

  2. 表设计是否合理

    单表不要有太多字段,建议在20以内

    合理的加入冗余字段可以提高查询速度

  3. 确定字段的数据类型是否合适

    数值型字段的比较比字符串的比较效率高得多,字段类型尽量使用最小、最简单的数据类型

    设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低,varchar的长度只分配真正需要的空间

    尽量使用TIMESTAMP而非DATETIME,尽量设计所有字段都得有默认值,尽量避免null

  4. 确定sql的书写是否有的题

    SELECT语句务必指明字段名称,避免直接使用select *

    SQL语句中IN包含的值不应过多

    可以用内连接,就尽量不要使用外连接

    使用连接连接查询来代替子查询

    适用联合(UNION)来代替手动创建的临时表

  5. 表数据比较多的时候是否添加了合适的索引

    表的主键、外键必须有索引

    经常出现在where子句中的字段,特别是大表的字段,应该建立索引

    经常用于排序、分组的字段,应当建立索引

    加上索引之后,还应该使用Explain来确认索引是否生效

  6. 如果上面的几项都没有问题,那可能就是因为服务器性能或者数据量过大导致的查询慢,此时可以考虑读写分离

    也就是我们搭建一个MySQL的主从集群,让1个主节点负责写入数据,多个从节点负责查询数据,已分摊查询压力

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

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

相关文章

rke2 Online Deploy Rancher v2.8.0 latest (helm 在线部署 rancher v2.8.0)

文章目录 1. 简介2. 预备条件3. 安装 helm4. 安装 cert-manager4.1 yaml 安装4.2 helm 安装 5. 安装 rancher6. 验证7. 界面预览 1. 简介 Rancher 是一个 Kubernetes 管理工具&#xff0c;让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托…

RPA财务机器人在厦门市海沧医院财务管理流程优化汇总的应用

目前国内外研究人员对于RPA机器人在财务管理流程优化领域中的应用研究层出不穷&#xff0c;但现有研究成果主要集中在财务业务单一领域&#xff0c;缺乏财务管理整体流程一体化管控的研究。RPA机器人的功能绝非单一的财务业务处理&#xff0c;无论从自身技术发展&#xff0c;或…

【野火i.MX6NULL开发板】挂载 NFS 网络文件系统

0、前言 参考资料&#xff1a; &#xff08;误人子弟&#xff09;《野火 Linux 基础与应用开发实战指南基于 i.MX6ULL 系列》PDF 第22章 参考视频&#xff1a;&#xff08;成功&#xff09; https://www.bilibili.com/video/BV1JK4y1t7io?p26&vd_sourcefb8dcae0aee3f1aab…

Veeam Backup12安装备份恢复ESXI7.0 U3虚拟机

介绍 只需单个平台即可保护并管理所有工作负载、应用及数据&#xff1a;云端、虚拟、物理、SaaS、Kubernetes、VMware、Hyper-V、Windows、Linux、UNIX、NAS、AWS、Azure、企业应用等。 个人主要用于备份ESXi上的虚拟机&#xff0c;可以实现单次完整备份&#xff0c;和定时的…

SpringBoot请求参数加密、响应参数解密

SpringBoot请求参数加密、响应参数解密 1.说明 在项目开发工程中&#xff0c;有的项目可能对参数安全要求比较高&#xff0c;在整个http数据传输的过程中都需要对请求参数、响应参数进行加密&#xff0c;也就是说整个请求响应的过程都是加密处理的&#xff0c;不在浏览器上暴…

Windows下Redis5+可视化软件下载、安装和配置教程-2024年1月8日

Windows下Redis5下载、安装和配置教程-2024年1月8日 一、下载二、安装三、配置环境四、配置可视化客户端 一、下载 redis是现在是没有对win系统版进行维护的&#xff0c;这个是大神完成的&#xff0c;目前是到5版本&#xff0c;选择Redis-x64-5.0.14.1.zip点击下载 下载地址&…

Spring MVC 异常处理器

异常处理器 如果不加以异常处理&#xff0c;错误信息肯定会抛在浏览器页面上&#xff0c;这样很不友好&#xff0c;所以必须进行异常处理。 异常处理思路 系统的dao、service、controller出现都通过throws Exception向上抛出&#xff0c;最后由springmvc前端控制器交由异常处…

爬虫之使用代理

爬虫—使用代理 1. 为什么使用代理 1.1 让服务器以为不是同一个客户端在请求 1.2 防止我们的真实地址被泄漏&#xff0c;防止被追究 2. 理解使用代理的过程 3. 理解正向代理和反向代理的区别 通过上图可以看出&#xff1a; 正向代理&#xff1a;对于浏览器知道服务器的真实…

MySQL运维实战(3.1) MySQL官方客户端使用介绍

作者&#xff1a;俊达 引言 MySQL是MySQL安装包默认的客户端&#xff0c;该客户端程序通常位于二进制安装包的bin目录中&#xff0c;或者通过rpm安装包安装mysql-community-client&#xff0c;是数据库管理系统的重要组成部分。MySQL客户端不仅仅是一个简单的软件工具&#x…

RK3568驱动指南|第十一篇 pinctrl 子系统-第123章dt_node_to_map函数分析

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

【python入门】day26:统计字符串中出现指定字符的次数

案例 实际上if name“main”:就相当于是 Python 模拟的程序入口 。由于模块之间相互引用&#xff0c;不同模块可能都有这样的定义&#xff0c;而入口程序只能有一个&#xff0c;选中哪个入口程序取决于 ** ** name** **的值。 代码 #-*- coding:utf-8 -*- #开发时间&#xff…

第一波!2024年1月精选6款实用AI人工智能设计工具合集

大家好&#xff0c;这是进入2024年之后的第一波干货合集&#xff01;这次的干货合集还是以 AI 相关的设计干货开头&#xff0c;这次有了在本地无限制帮你清理图片中元素的 AI 工具&#xff0c;有知名免费图库出品的实时 AI 图片生成工具、将截图直接转化为代码的超强工具&#…

听觉障碍应该找哪些专业人士?如何获得这些职业?

如果您有听觉障碍的困扰可以寻求以下专业人士的帮助。如果你有兴趣从事听力学职业&#xff0c;可以考虑以下 十几个选项&#xff1a; 1. 临床听力学家 临床听力学家检查患者以诊断他们的听力、平衡或耳朵相关问题。他们与所有年龄段的患者一起工作&#xff0c;或专门针对特定群…

一步步指南:从指定时长中提取需求的帧图片,高效剪辑视频

在现代多媒体时代&#xff0c;视频已经成生活中不可或缺的一部分。从视频中提取某一帧图片&#xff0c;或者对视频进行剪辑&#xff0c;都是常见的需求。下面一起来看云炫AI智剪如何从指定时长中提取需求的帧图片&#xff0c;如何高效地剪辑视频。 按指定时长提取视频某帧图片的…

Openwrite帮我们实现一文多发

Openwrite 一文多发 当你想进入这个搞自媒体的圈子&#xff0c;学着人家一样去搞流量、做IP的时候&#xff0c;就会发现&#xff0c;卖铲子的和卖教程的都赚钱了。而对于商业一无所知的人&#xff0c;只能是接盘侠。可是&#xff0c;接盘侠又如何呢&#xff1f;高客单付不起&a…

【PaperReading】4. TAP

Category Content 论文题目 Tokenize Anything via Prompting 作者 Ting Pan, Lulu Tang, Xinlong Wang, Shiguang Shan (Beijing Academy of Artificial Intelligence) 发表年份 2023 摘要 提出了一个统一的可提示模型&#xff0c;能够同时对任何事物进行分割、识别和…

使用postman做接口测试(一)

如何执行HTTP接口测试。包括如下三步&#xff1a; 构造一条符合要求的HTTP请求消息&#xff1b;发给我&#xff0c;我给你回响应&#xff1b;你读取HTTP响应&#xff0c;检查响应内容是否正确。 今天我们就讲&#xff0c;如何使用postman发送符合要求的HTTP请求。 how-如何安…

大创项目推荐 深度学习火车票识别系统

文章目录 0 前言1 课题意义课题难点&#xff1a; 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 图像识别 火车票识别系统 该项目较为新颖&#xff0c;适…

在机械行业中,直线导轨和弧形导轨哪个应用范围更广泛?

弧形导轨和直线导轨是两种常见的导轨类型&#xff0c;直线导轨主要被用于高精度或快速直线往复运动场所&#xff0c;而弧形导轨是一种专门设计用于曲线运动的导轨系统&#xff0c;那么在机械行业中&#xff0c;直线导轨和弧形导轨哪个应用范围更加广泛呢&#xff1f; 直线导轨主…

GPT2:Language Models are Unsupervised Multitask Learners

目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据&#xff0c;更大的模型 2、大数据量&#xff0c;大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…