首页 > 数据库 >MySQL常见面试题(2025年最新)

MySQL常见面试题(2025年最新)

时间:2024-12-17 20:02:30浏览次数:6  
标签:面试题 索引 优化 事务 查询 2025 MySQL 数据 节点

1.char和varchar的区别

①char设置多少长度就是多少长度,varchar可以改变长度,所以char的空间利用率不如varchar的空间利用率高。
②因为长度固定,所以存取速度要比varchar快。
③char适用于固定长度的字符串,比如身份证号、手机号等,varchar适用于不固定的字符串。

2.数据库的三大范式

第一范式(1NF): 保证字段不可再分,保证原子性。
第二范式(2NF): 满足1NF前提下,表的每一列都必须和主键有关系。消除部分依赖关系。
第三范式(3NF): 满足2NF前提下,表的每一列比必须和主键有直接关系,不能是间接关系。消除传递依赖

3.你了解sql的执行顺序吗?

select distinct(去重) 聚合函数

from 表1

[inner join | left join | right join](连接) 表2

on(连接条件) 表1.字段 = 表2.字段

where 查询条件

group by(分组) 字段

having 分组过滤条件

order by(排序) 字段

limit(分页) 0,10

4.索引是什么

是一种高效获取数据的数据结构,相当于目录,更快的找到数据,是一个文件,占用物理空间。

5.索引的优点和缺点

优点:
①提高检索的速度。
②索引列对数据排序,降低排序成本。
③mysql 8之后引入了,隐藏索引,当一个索引被隐藏就不会被优化器所使用,就可以看出来索引对数据库的影响,有利于调优。
缺点:
①索引也是一个文件,所以会占用空间。
②降低更新的速度,因为不光要更新数据,还要更新索引。

6.索引的类型

①普通索引: 基本索引类型,允许定义索引的字段为空值和重复值。
②唯一索引: 索引的值必须唯一,允许定义索引的字段为空值。
③主键索引: 索引的值必须唯一,不可以为空。
④复合索引: 多个字段加索引,遵守最左匹配规则。
⑤全局索引: 只有在 MyISAM 引擎上才能使用。

7.索引怎么设计(优化)

①选择唯一性索引:值是唯一的,查询的更快。
②经常作为查询条件的字段加索引。
③为经常需要排序、分组和联合操作的字段建立索引:order by、group by、union(联合)、distinct(去重)等。
④限制索引个数:索引数量多,需要的磁盘空间就越多,更新表时,对索引的重构和更新就很费劲。
⑤表数据少的不建议使用索引(百万级以内):数据过少,有可能查询的速度,比遍历索引的速度都快。
⑥删除不常用和不再使用的索引。
⑦用类型小的类型做索引:比如:int和BIGINT能用int就使用int。因为类型小,查询速度快和索引占用的空间更少。
⑧使用前缀索引,要是字符串越长,那么索引占的空间越大,并且比较起来就时间就越长。

8.怎么避免索引失效(也属于sql优化的一种)

①某列使用范围查询(>、<、like、between and)时, 右边的所有列索引也会失效。
②不要对索引字段进行运算。
③在where子句中不要使用 OR、!=、<>和对值null的判断。
④避免使用’%'开头的like的模糊查询。
⑤字符串不加单引号,造成索引失效。

9.索引的数据类型

Hash: 查询时调用Hash函数获得地址,回表查询实际数据。(InnoDB和MylSAM不支持,Memory支持)。
B+树: 每次从根节点出发去查询,然后得到地址,回表查询实际数据。

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记及答案【点击此处即可】免费获取

10.索引为什么使用树结构

因为可以加快查询效率,而且可以保持有序。

11.二叉查找树、B树、B+树

二叉查找树(二叉排序树、二叉搜索树): 一个节点最多两个子节点(左小右大),查询次数和比较次数都是最小的,但是索引是存在磁盘的,当数据量过大的时候,不能直接把整个索引文件加载到内存,需要分多次IO,最坏的情况IO的次数就是树的高度,为了减少IO,需要把树从竖向变成横向。
B树( B- ): 是一种多路查询树,每个节点包含K个子节点,节点都存储索引值和数据,K是B树的阶(树高被称为树的阶)。虽然比较的次数比较多,但是是在内存的比较,可以忽略不计,但是B树IO的次数要比二叉查找树要少,因为B树的高度可以更低。
B+树: B树的升级版,只有叶子节点储存的是索引值指向的数据库的数据。

12.为什么使用B+树不用B树

①B树只适合随机检索,而B+树同时支持随机检索和顺序检索(因为叶子节点相当于链表,保存索引值都是有序的)。
顺序检索: 按照序列顺序遍历比较找到给定值。
随机检索: 不断从序列中随机抽取数据进行比较,最终找到结果。

②减少了磁盘IO,提高空间利用率: 因为B+树非叶子节点不会存放数据,只有索引值,所以非叶子节点可以保存更多的索引值,这样B+树就可以更矮,减少IO次数。

③B+树适合范围查找: 这才是关键,因为数据库大部分都是范围查找,B+树的叶子节点是有序链表,直接遍历就行,而B树的范围查找可能两个节点距离很远,只能通过中序遍历去查找,所以使用B+树更合适。
中序遍历: (根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)

13.最左匹配原则

最左优先,以最左边为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between and、like)就会停止匹配。

例如:Z表建立联合索引 (a,b,c)

//这样索引abc列都起效,因为符合最左匹配原则,where子句几个搜索条件顺序调换不影响查询结果,因为Mysql中有查询优化器,会自动优化查询顺序
select  *  from Z where a = 1 and b = 2 and c = 3 

//因为a列是起点,没有a列匹配不上,所以索引失效
select * from table_name where  b = 2 and c = 3 

//因为连续不到b,所以只有a列索引生效
select * from table_name where  a = 1 and c = 3 

14.Mysql怎么查看是否使用到索引或怎么查看sql执行计划

使用explain

例如:explain select * from 表名 where 条件
结果:会查出key,key就是你使用的索引。还有type这个字段,可以看到索引是全表扫描还是索引扫描等等。
type字段内容性能对比:ALL < index < range ~ index_merge < ref < eq_ref < const < system

15.一条sql查询非常慢,我们怎么去排查和优化?

排查:
(1) 开启慢查询。
(2) 查看慢查询日志(定位低效率sql,命令:show processlist)。
(3) 使用explain查看sql的执行计划(看看索引是否失效或者性能低)

优化:
sql优化 + 索引 + 数据库结构优化 + 优化器优化

16.MylSAM和InnoDB、Memory的区别

MylSAM: mysql5.5之前的存储引擎,是表锁(悲观锁)级别的,不支持事务和外键。
InnoDB: mysql5.5之后的存储引擎,是行锁(乐观锁)级别的,支持事务和外键。
Memory: 内存数据库引擎,因为在内存操作,所以读写很快,但是Mysql服务重启,会丢失数据,不支持事务和外键。

17.什么是事务

事务是对数据库中一系列操作进行统一的回滚或者提交的操作,主要用来保证数据的完整性和一致性。

18.事务的四大特性(ACID)

原子性(Atomicity): 要么全部成功要么全部失败。
一致性(Consistency): 事务执行前和事务执行后,原本和数据库一致的数据仍然一致。
隔离性(Isolation): 事务与事务之间互不干扰。
持久性(Durability): 事务一旦被提交了,那么对数据库中的数据的改变就是永久的。

19.脏读、不可重复读、幻读

脏读: 也叫"读未提交",顾名思义,就是某一事务A读取到了事务B未提交的数据。
不可重复读: 在一个事务内,多次读取同一个数据,却返回了不同的结果。实际上,这是因为在该事务间隔读取数据的期间,有其他事务对这段数据进行了修改,并且已经提交,就会发生不可重复读事故。
幻读: 在同一个事务中,第一次读取到结果集和第二次读取到的结果集不同。像幻觉一样所以叫幻读。
从上面可以看出脏读和不可重复读是基于数据值的错误,幻读是基于条数增加或者减少的错误事务和隔离级别详解及实际应用

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记及答案【点击此处即可】免费获取

20.事务的隔离级别?

① read uncommited(读取未提交内容): 在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)
② read committed(读取提交内容): 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。一个事务只能看见已经提交事务所做的改变。可解决脏读
③ repeatable read(可重读): 这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。可解决脏读、不可重复读
④ serializable(可串行化) : 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。可解决脏读、不可重复读、幻读。

21.怎么优化数据库

①SQL优化
②加缓存
③分表
④读写分离

22.SQL优化

①不要用select *,要使用具体字段。
②使用数值代替字符串,比如:0=唱,1=跳,2=rap。
③避免返回大量数据,采用分页最好。
④使用索引,提升查询速度,不宜建太多索引,不能建在重复数据比较多的字段上。
⑤批量插入比单条插入要快,因为事务只需要开启一次,数据量太小体现不了。
⑥避免子查询,优化为多表连接查询。
⑦尽量使用union all替代union,因为union会自动去重。

23.常用的聚合函数

①sum(列名) 求和     
②max(列名) 最大值     
③min(列名) 最小值     
④avg(列名) 平均值     
⑤first(列名) 第一条记录
⑥last(列名) 最后一条记录
⑦count(列名) 统计记录数不包含null值 count(*)包含null值。

24.几种关联查询

内连接(inner join): 查询两个表匹配数据。
左连接(left join): 查询左表全部行以及右表匹配的行。
右连接(right join): 查询右表全部行以及左表匹配的行。

25.in和exists的区别

in(): 适合子表(子查询)比主表数据小的情况。
exists(): 适合子表(子查询)比主表数据大的情况。

26.drop、truncate、delete的区别

速度: drop > truncate > delete。
回滚: delete支持,truncate和drop不支持。
删除内容: delete表结构还在,删除部分或全部数据,不释放空间。truncate表结构还在,删除全部数据,释放空间。drop表结构和数据不在,包括索引和权限,释放空间。

标签:面试题,索引,优化,事务,查询,2025,MySQL,数据,节点
From: https://blog.csdn.net/2401_89221704/article/details/144539768

相关文章

  • ARM银河麒麟/统信UOS安装docker下mysql5.7,全步骤验证
    背景:网上找很多没有这个教程,自己写一个吧系统:银河麒麟v10桌面版/统信UOSv20桌面版架构:ARM64docker版本:20.10.7mysql版本:5.7软件包:dockr-20.10.7.tga、mysql5.7.tar软件包下载地址:将稍后提供,如需要请在评论区留言一、安装docker1.解压和移动docker安装文件tar-zxv......
  • 跨越边界:MySQL跨平台性能优化全攻略
    在当今全球化和技术多样化的背景下,确保应用程序能够在各种操作系统上无缝运行并提供一致的用户体验变得至关重要。对于数据库系统而言,这意味着不仅要保证数据的一致性和完整性,还要确保其在不同环境下的高效运作。MySQL作为世界上最受欢迎的关系型数据库管理系统之一,支持多种......
  • 预见未来:基于MySQL的实时用户行为预测系统构建指南
    在这个信息爆炸的时代,理解并预测用户的下一步行动成为了企业竞争的关键。无论是电商平台推荐商品、社交媒体推送内容还是在线广告精准投放,实时用户行为预测都能为企业带来显著的竞争优势。然而,如何高效地处理海量数据,并从中挖掘出有价值的信息,是每一个开发者和分析师面临的......
  • 守护数据隐私:构建基于差分隐私的MySQL安全共享机制
    在当今数字化时代,随着互联网和大数据技术的发展,数据的价值愈发凸显。然而,随之而来的个人隐私泄露风险也日益增加,成为社会广泛关注的问题之一。特别是在医疗、金融等领域,如何既能充分利用海量数据资源推动行业发展,又能有效保护用户隐私不被侵犯,成为了亟待解决的重要课题。本......
  • 使用Flink实现MySQL实时同步数据到StarRocks(库表级)
    这里引用官网的文章+我在使用时遇到的问题。官网已经讲解的很明白了。从MySQL实时同步StarRocks支持多种方式将MySQL的数据实时同步至StarRocks,支撑实时分析和处理海量数据的需求。本文介绍如何将MySQL的数据通过ApacheFlink®实时(秒级)同步至StarRocks。注意导......
  • 7 Oracle 经典面试题解析
    PL/SQL面试题--1、创建序列seq_employee,该序列每次取的时候自动增加,从1开始计数,不设最大值,并且一直累加,不循环;CREATESEQUENCEseq_employeeSTARTWITH1INCREMENTBY1NOMAXVALUE;--也可以直接使用简单默认参数:--CREATESEQUENCEseq_employee;SELECTseq_employee.NEXTV......
  • 2025年网络安全零基础自学全攻略:避开弯路,快速上手!
     自学网络安全是一项充满挑战的任务,但只要遵循合适的学习路径,能够有效避免走弯路,逐步建立知识体系,最终可以在该领域取得成就。本文将为你提供2025年最新的网络安全自学攻略,帮助你高效地规划学习路线,掌握网络安全的核心知识,避免学习中的误区。目录自学网络安全的......
  • 常见操作系统中安装MySQL的详细步骤
    一、在Windows系统中安装MySQL下载MySQL安装包访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/)。根据你的操作系统版本(32位或64位)选择合适的MySQLCommunityServer安装包,如MySQLCommunityServer8.0。点击下载按钮开始下载。运行安装程序找到下载好的安装......
  • 如何在MySQL中实现组内排序?
    在MySQL数据库中,组内排序(group-wiseordering)是一种常见的操作需求,它涉及对查询结果进行分组,并在每个分组内进行排序,这种操作在数据分析和报告生成时非常常见,尤其是在需要对每个分组的数据进行详细分析的情况下。组内排序的基本概念组内排序通常与GROUPBY子句一起使用,用于对......
  • 【MySQL】索引特性
    MySQL中的索引是用来提高数据库查询效率的一种数据结构。以下是一些MySQL索引的特性:1. 唯一性:• 唯一索引(UniqueIndex)确保索引列的值是唯一的,不允许有重复的值。2. 主键索引:• 每个表都有一个主键索引(PrimaryKey),它是一个特殊的唯一索引,并且每个表只能有一个主键......