MySQL基础题

目录

1.MySQL中我发送一条SQL请求,后续会怎么处理,经过哪些流程?

2.处理SQL过程中优化器会对SQL语句进行改写吗?

3.介绍一下MySQL中的crud操作?

4.SQL查询中各个关键字执行的先后顺序

[5.InnoDB 和 MyISAM 有什么区别](#5.InnoDB 和 MyISAM 有什么区别)

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

7.MySQL中的数据排序是怎么实现的?

[8.MySQL的Change Buffer是什么?它有什么作用?](#8.MySQL的Change Buffer是什么?它有什么作用?)

9.什么是批量数据入库?相比单条插入有什么优势?

10.什么是数据全量同步和增量同步?它们各有什么优缺点?

[11.MySQL中 DELETE、DROP 和 TRUNCATE的区别是什么?](#11.MySQL中 DELETE、DROP 和 TRUNCATE的区别是什么?)

[12.MySQL 中 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?](#12.MySQL 中 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?)

[13.MySQL中`LIMIT 100000000,10`和`LIMIT 10`的执行速度是否相同?](#13.MySQL中LIMIT 100000000,10LIMIT 10的执行速度是否相同?)

14.数据库的三大范式是什么?

15.MySQL中TEXT类型最大可以存储多长的文本?

16.MySQL中AUTO_INCREMENT列达到最大值时会发生什么?

17.什么是数据库的视图?

18.为什么不推荐在MySQL中直接存储图片、音频、视频等大容量内容?

19.相比于Oracle,MySQL的优势有哪些?

20.MySQL中VARCHAR(100)和VARCHAR(10)的区别是什么?

1.MySQL 中我发送一条 SQL 请求,后续会怎么处理,经过哪些流程?

1.建立连接,客户端发送请求给服务器建立连接,服务器进行进行身份认证

2.对SQL语句的进行语法分析和语义分析

3.使用优化器会对 SQL 语句进行优化,选择合适的索引和表连接顺序,最终选择一个最佳的执行计划

4.执行器根据优化器选择的执行计划,调用引擎层接口来执行具体的操作,将执行结果返回给客户端

2.处理SQL过程中优化器会对SQL 语句进行改写吗?

是的,MySQL 查询优化器会对 SQL 语句进行自动改写,目的是在不改变语义的前提下,将原始 SQL 转换为更高效的执行形式,以降低执行成本(如减少 IO 或 CPU 消耗)。这种改写是优化器生成最优执行计划的重要步骤之一。

常见的 SQL 改写方式

  1. 消除冗余括号优化器会移除 SQL 中不必要的括号,简化逻辑结构。
  2. 常量传递与简化若条件中包含常量计算或已知值,优化器会提前计算并简化表达式。
  3. 消除无效条件对于恒真或恒假的条件,优化器会直接处理以减少计算。
  4. **子查询优化(转为连接)**对于部分子查询(尤其是非关联子查询),优化器会将其改写为连接(JOIN)操作,以利用索引或更高效的连接算法。
  5. 外连接转为内连接 若外连接(LEFT JOIN/RIGHT JOIN)的条件中包含 "被驱动表的非空判断",优化器可能将其转为内连接(INNER JOIN),因为此时外连接的 "保留无匹配行" 特性已失效,内连接效率更高。
  6. 表达式等价转换 优化器会对条件表达式进行等价替换,以适配索引或简化计算。语义不变:改写后的 SQL 必须与原始 SQL 返回完全相同的结果。

3.介绍一下 MySQL 中的 crud 操作?

主要涉及的是增删查改操作

C操作,创建,向表中新增数据

复制代码
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);

R操作,读取,读取表中数据,select,可以搭配where来筛选条件,通过order by进行排序,通过distinct对数据进行去重,通过group by进行分组,通过having对分组数据进行筛选,还可以使用limit 进行筛选分页

复制代码
SELECT 字段 FROM 表名 WHERE 条件......;

U操作,更新,通过update对数据进行更新

复制代码
UPDATE 表名 SET 字段1 = 新值1, 字段2 = 新值2 WHERE 条件;

D操作,删除,通过delete 对数据进行删除

复制代码
DELETE FROM 表名 WHERE 条件;

4.SQL 查询中各个关键字执行的先后顺序

from -> where -> group by ->having -> select -> distinct -> order by -> limit

5.InnoDB 和 MyISAM 有什么区别

1.事务支持,InnoDB支持事务, MyISAM不支持

2.外键支持,InnoDB支持外键,支持多个表建立关系,MyISAM不支持

3.索引结构,InnoDB是聚簇索引,MyISAM是非聚簇索引

4.Count(*)的效率:InnoDB不保存具体的行数,每次取select行数时,会全表扫描。MyISAM用了一个变量来保存行数,select时只需输出变量的值即可

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

1.数据存储方式

  • 关系型:存储的是表结构,表中有很多字段,类型和约束
  • 非关系型:主要存储的是键值对

2.核心特性

  • 关系型:支持事务(ACID)、强一致性,能通过 SQL 语句做复杂查询,数据完整性靠约束保障。
  • 非关系型:不强调事务(部分支持弱事务),追求高并发、高可用,查询简单直接,不擅长复杂多表关联,数据一致性靠应用程序维护。
  1. 适用场景
  • 关系型:需要数据精准关联、事务保障的场景(电商订单、银行转账、用户账户)。
  • 非关系型:需要高并发读写的场景(社交 APP 动态、电商商品缓存、日志存储)。

7.MySQL中的数据排序是怎么实现的?

排序过程中,如果排序字段命中索引,则利用索引排序

反之,使用文件排序

文件排序中,如果数据量少则在内存中排序,具体是使用单路排序或者双路排序。

如果数据大则利用磁盘文件进行外部排序,一般使用归并排序。

解释:

索引排序

如果查询中的ORDERBY子句包含的字段已经在索引中,并且索引的排列顺序和ORDERBY子句一致,则可直接利用索引进行排序。这种方式效率最高。

文件排序

如果排序的数据没有超过sort_buffer的大小,就可以在内存排序。如果超过了则利用磁盘文件进行排序,性能比较差

双路排序

有一个叫max_length_for_sort_data参数,默认是4096字节,如果select 列的数据长度超过它,则MySQL采用row_id排序,即把row_id(有主键就是主键)+排序字段放置到sort_buffer中排序。

我们来举例理解下双路排序。

比如现在要执行:

复制代码
select a,b,c from t1 where a ='奇点' order by b;

假设select 列的数据长度超过了max_length_for_sort_data,为了节省排序占用的空间,此时sort_buffer只会有放置id和b来排序。

排序后,再通过id回表查询得到a、b、c,最终将最后的结果集返回给客户端。所以排序需要多个回表的过程,等于需要两次查询,也叫双路排序(Two-PassSort)。
单路排序

假设select 列的数据没有超过max_length_for_sort_data,则可以进行单路排序(Single-Pas Sort),就是将select 的字段都放置到sort_buffer中。

排序后直接得到结果集,返回给客户端即可,相比双路排序它减少了回表的动作,因此效率更高。

一开始MySQL只有双路排序,后续优化推出了单路排序。
磁盘文件临时排序

前面提到,如果查询的数据超过sort_buffer,说明内存放不下了,因此需要利用磁盘文件进行外部排序,一般会使用归并排序,简单理解就是将数据分为很多份文件,单独对文件排序,之后再合并成一个有序的大文件。

利用磁盘排序效率会更低,针对一些情况可以调大sort_buffer_size,避免磁盘临时文件排序。

8.MySQL的Change Buffer是什么?它有什么作用?

ChangeBuffer是MySQLInnoDB存储引擎中的一个机制,用于暂存对二级索引的插入和更新操作 的变更,而不立即执行这些操作,随后,当InnoDB进行合适的条件时(如页被读取或Flush操作),会将这些变更写入到二级索引中。(只对二级索引,其他索引不是)

作用:

提高写入性能:通过将对二级索引的变更暂存,可以在后续的操作中批量处理这些变更,可以减少对磁盘的频繁写入,提升插入和更新操作的性能。

9.什么是批量数据入库?相比单条插入有什么优势?

批量数据入库,指的是一次性将多条数据通过一条SQL或一次数据库交互插入到数据库中,而不是逐条执行多次INSERT操作。

它的最大优势有两个:

1.减少网络开销:单条插入需要客户端和数据库反复通信;批量插入则一次发送多条数据,减少网络往返(RTT)。

2.提升数据库写入性能:数据库在执行一条SQL时会有解析、编译、日志写入等开销,批量写入能把这些成本摊薄。

10.什么是数据全量同步和增量同步?它们各有什么优缺点?

数据全量同步: 指的是每次同步时,都将源数据中的所有记录完整地复制到目标端。简单说,就是"全部重来一遍"。
数据增量同步: 指的是只同步自上次同步以来发生变化的数据(包括新增、修改或删除的记录),类似于"只更新变化的部分"。

举例:

全量同步:每天凌晨3点,把整张user表重新导出、导入一遍。

增量同步:每5分钟只同步update_time大于上次同步时间的数据。

全量同步简单稳定,逻辑清晰,但是数据量大时效率低,对系统压力大

增量同步效率高,系统压力小,但是实现起来复杂,可能会有遗漏变更

11.MySQL中 DELETE、DROP 和 TRUNCATE的区别是什么?

1.Delete用于删除行数据,但保留表结构和相关的对象。

2.Drop用于完全删除数据库表,包括数据和结构。

3.Truncate清空表中所有数据,不会删除表结构和索引等其他结构。

从性能来看,Drop > Truncate > Delete

12.MySQL 中 INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别是什么?

INNER JOIN(内连接):只返回两个表中匹配的行。如果没有匹配,则该行不会出现在结果集中。

LEFT JOIN (左外连接):返回左表中的所有行,即使右表中没有匹配的行。如果右表没有匹配,则结果中的右侧列会显示为NULL。

RIGHT JOIN (右外连接):返回右表中的所有行,即使左表中没有匹配的行。如果左表没有匹配,则结果中的右侧列会显示为NULL。

13.MySQL中`LIMIT 100000000,10`和`LIMIT 10`的执行速度是否相同?

LIMIT 10 的执行逻辑,只需从查询结果集中读取前 10 条记录,找到后立即停止扫描,无需处理后续数据,效率很高。

LIMIT 100000000 , 10的执行逻辑,需要先扫描并跳过前 1 亿条记录,再读取接下来的 10 条。效率比较低,即使有索引,跳过 1 亿条记录仍需遍历大量索引节点(B + 树层级跳转、页加载),耗时极长

14.MySQL中DATETIME和TIMESTAMP类型的区别是什么?

维度 DATETIME TIMESTAMP
范围 1000-01-01 至 9999-12-31 1970-01-01 至 2038-01-19(UTC)
时区处理 不转换,存原始时间,存入和取出的数值完全一致 基于 Unix 时间戳,自动转换为 UTC 存储,查询时转回会话时区
存储大小 8 字节(基础版) 4 字节(基础版)
适用场景 跨时区无关、需长期存储的时间 跨时区同步、近现代时间(如日志、操作记录)

14.数据库的三大范式是什么?

第一范式(1NF):

确保每个列的值都是原子值,表中的每个字段只能包含单一的数据项**,不允许重复的列和多值字段。**

第二范式(2NF):

在满足第一范式的基础上,确保表中每个非主键字段完全依赖于主键,而不是部分依赖。即,非主键字段必须依赖于整个主键

第三范式(3NF):

在满足第二范式的基础上,确保非主键字段之间不依赖,即消除传递依赖。所有非主键字段只能依赖于主键,不应相互依赖。

15.在MySQL中,你使用过哪些函数?问到概率不大

日期函数:

now() :获取当前日期时间(YYYY-MM-DD HH:MM:SS

data_format**(date, format)**:格式化日期

字符串函数

concat**(str1, str2, ...)**:拼接多个字符串

lowe**(str) /** upper**(str)**:转换为小写 / 大写

聚合函数

count(expr) :统计记录数(COUNT(*)包含 NULL,COUNT(字段)排除 NULL)

sum(col) / avg(col):求和 / 求平均值

max(col) / min**(col)**:取最大值 / 最小值

15.MySQL中TEXT类型最大可以存储多长的文本?

子类型 最大存储长度
tinytext 255 字节(约 255 个英文或 85 个中文)
text 65,535 字节(约 6.4KB,6 万多英文或 2 万多中文)
mediumtext 16,777,215 字节(约 16MB)
longtext 4,294,967,295 字节(约 4GB)

16.MySQL中AUTO_INCREMENT列达到最大值时会发生什么?

在MySQL中,如果表定义的自增ID到达上限后,再申请下一个ID,得到的值不变!因此会导致报重复值的错误。

17.什么是数据库的视图?

数据库的视图是一个虚拟表,它并不存储实际的数据,而是通过查询其他表的数据来生成的。

它可以包含一个或多个表的数据,并且可以对这些数据进行筛选、计算、排序等操作。

18.为什么不推荐在MySQL中直接存储图片、音频、视频等大容量内容?

1.性能差:

图片,视频这些文件太大了,占用的磁盘空间大,IO效率降低,查询时需要加载大文件,耗时久,占用数据库资源,影响数据库其他操作

2.数据库备份与恢复成本极高:

文件太大了,备份时间变长,恢复数据时也慢,容易失败

3.维护成本高:

  • MySQL 对大字段(如 LONGTEXT、BLOB)的索引支持差,无法通过索引快速定位媒体文件,查询时只能全表扫描维护成本高。
  • 数据库迁移、扩容时,大文件的传输和同步会成为瓶颈,影响业务连续性。

存在更好的替代方案

  1. 专业文件存储服务(如阿里云 OSS、AWS S3):专门优化大文件的存储、传输和访问,支持 CDN 加速、断点续传、权限控制,成本更低。
  2. 本地文件系统:将文件存在服务器本地,数据库仅存储文件路径(如/uploads/2024/05/12/xxx.jpg),访问时通过 Web 服务器直接读取文件,无需经过数据库。

19.相比于Oracle,MySQL的优势有哪些?

1.成本低,开源免费

2.轻量灵活,部署和扩展简单

3.读写性能均衡,响应速度快

20.MySQL中VARCHAR(100)和VARCHAR(10)的区别是什么?

两者的区别就是能存储的字符串长度上限不同,字符数上限是由定义中的括号内的数字决定的。

VARCHAR(100)最多可以存储100个字符。

VARCHAR(10)最多可以存储10个字符。

21.MySQL 中的 EXISTS 和 IN 有什么区别?

  • EXISTS用于判断子查询是否返回结果,通常用于检查某个条件是否满足。
  • IN用于检查某个值是否在指定的集合中,可以是一个子查询或静态值列表。

22.什么是数据库的逻辑删除?数据库的物理删除和逻辑删除有什么区别?

逻辑删除是一种将数据标记为已删除但实际不会从数据库中移除的删除方式。一般是在表中添加一个表示删除状态的字段,如is-deleted,默认是0表示未删除,1表示已删除。

物理删除则是直接从数据库中删除记录。

一般业务上都是使用逻辑删除,便于后续的数据分析、追溯等。

相关推荐
cherry52302 小时前
Java大厂面试真题:Spring Boot + 微服务 + 缓存架构三轮技术拷问实录
jvm·spring boot·mysql·微服务·java面试·分布式架构·redis缓存
唐古乌梁海2 小时前
【mysql】MySQL 数据库迁移
数据库·mysql·adb
啊吧怪不啊吧2 小时前
SQL之表的时间类内置函数详解
大数据·服务器·数据库·sql
2503_928411562 小时前
11.5 包和包管理器
数据库·arcgis·node.js·编辑器
JanelSirry2 小时前
真实场景:防止缓存穿透 —— 使用 Redisson 布隆过滤器
数据库·mysql·缓存·redisson·布隆过滤器
mmm.c2 小时前
mysql启动提示1067:进程意外终止
数据库·mysql
埃泽漫笔3 小时前
Redis单线程还是多线程?
数据库·redis·缓存
虎子_layor3 小时前
PostgreSQL这么多优势,为什么还要使用MySQL
后端·sql
TDengine (老段)3 小时前
TDengine 产品组件 taosX
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据