MySQL 基本面试题

目录

一、SQL的基本操作

1、SQL查询的执行顺序

2、count(*)、count(1) 、count(列名) 的区别

3、char 和 varchar 的区别

4、MySQL 中常用的基础函数

5、MySQL的执行流程

6、MyISAM和InnoDB的区别

二、事务

1、事务的基本概念

2、事务的四大特性(ACID)

3、事务的四种隔离级别

4、MVCC多版本并发控制协议

三、索引

1、什么是索引

2、索引按功能分类

3、什么是索引覆盖和回表查询

4、什么是最左匹配原则

5、MySQL 索引失效的常见场景

四、锁

1、按锁粒度分类

2、按锁模式分类

五、优化

1、针对千万级数据表的性能优化

六、MySQL 的组复制

1、什么是MySQL Group Replication?它与传统主从复制有什么区别?

2、Group Replication如何保证数据一致性

3、当Group Replication出现脑裂问题时如何解决?


一、SQL的基本操作

1、SQL查询的执行顺序

from > join > where > group by > having > select > order by > limit

(1)FROM 和 JOIN - 首先确定数据来源,包括表及其连接方式

(2)WHERE - 对数据进行初步筛选

(3)GROUP BY - 按照指定列分组

(4)HAVING - 对分组后的结果进行筛选

(5)SELECT - 选择要返回的列(包括计算列)

(6)DISTINCT - 去除重复行

(7)ORDER BY - 对结果排序

(8)LIMIT - 限制返回的行数

2、count(*)、count(1) 、count(列名) 的区别

(1)count(*):统计表中所有行的数量,包括 NULL 值。

(2)count(1):统计表中所有行的数量,与 count(*) 效果相同,MySQL 会优化为相同执行计划。

(3)count(列名):统计指定列中非 NULL 值的数量。

3、char 和 varchar 的区别

(1)存储方式:char 固定长度,总是占用定义的长度空间,例如 char(9)只存了3个字节,那么剩余的6个字节插入时会用空格填充到指定长度,查询时会去除尾部空格。varchar 可变长度,按原样存储,不会自动添加或去除空格。

(2)存储效率:char 适合存储长度基本固定的数据(如MD5哈希值、国家代码等)。varchar 适合存储长度变化大的数据(如用户名、地址等)。

4、MySQL 中常用的基础函数

(1)concat(a,b,c):合并字符串 

-- 合并字符串
SELECT name,department, CONCAT(name, '(', department, ')') AS name_dept FROM employees;


(2)SUBSTRING(s, start, length),从字符串 s 的 start 位置截取长度为 length 的子字符串。

--  SUBSTRING 提取字符串
SELECT email, SUBSTRING(email, 1, 5) AS prefix FROM employees WHERE email IS NOT NULL;


(3)replace(原始字符串, 要查找的子串, 替换为的新字符串)

-- 将 name 中的"八"替换为"九"
SELECT name,REPLACE(name, '八', '九') AS new_description
FROM employees;

5、MySQL的执行流程

(1)连接阶段:客户端通过连接器与MySQL服务器建立连接,连接器负责身份验证(用户名/密码验证),验证通过后,连接器检查权限表确定用户的权限。

(2)查询缓存阶段:服务器查询缓存,如果找到完全匹配的缓存,直接返回结果。

(3)解析阶段:将 SQL 语句分解,检查 SQL 语句是否正确,生成解析树。

(4)预处理阶段:检查表和列是否存在,检查列名是否歧义,检查用户是否有权限访问相关表。

(5)查询优化阶段:优化器会重写查询以提高性能,生成执行计划,选择最优计划。

(6)执行阶段:通过执行计划查询引擎,并调用API接口访问存储引擎获取数据。

(7)返回结果阶段:将查询结果返回客户端,并存入缓存。

6、MyISAM和InnoDB的区别

特性MyISAMInnoDB
事务支持❌ 不支持✅ 支持 ACID 事务
锁机制表级锁行级锁(默认)、支持多版本并发控制 (MVCC)
外键支持❌ 不支持✅ 支持
崩溃恢复❌ 较差(可能丢失数据)✅ 优秀(通过事务日志恢复)
存储结构3个文件:
.frm(表结构)
.MYD(数据)
.MYI(索引)
1个文件:
.frm(表结构)+表空间文件(数据和索引)
缓存机制只缓存索引(Key Cache)缓存数据和索引(Buffer Pool)
全文索引✅ 支持(FULLTEXT)✅ MySQL 5.6+ 支持
COUNT(*) 效率⚡ 极快(存储行数)⏳ 较慢(需扫描表或索引)
压缩表✅ 支持❌ 不支持
热备份❌ 需要锁表✅ 支持(通过事务日志)
适用场景读密集型应用
不需要事务
大量COUNT查询
写密集型应用
需要事务
高并发操作
默认引擎MySQL 5.5 之前默认MySQL 5.5+ 默认
数据文件大小限制256TB64TB(理论上可更大)
AUTO_INCREMENT表级计数器内存中的计数器(更高效)
地理空间索引✅ 支持✅ MySQL 5.7+ 支持
哈希索引❌ 不支持✅ 支持(自适应哈希索引)

二、事务

1、事务的基本概念

事务(Transaction)是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作,这些操作要么全部执行,要么全部不执行。

START TRANSACTION;  -- 或 BEGIN
-- 执行SQL语句
COMMIT;            -- 提交事务
-- 或
ROLLBACK;          -- 回滚事务

2、事务的四大特性(ACID)

(1)原子性

定义:事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败回滚。

实现原理:通过 undo log 进行回滚。


(2)一致性

定义:事务执行前后,数据完整性约束没有被破坏。


(3)隔离性

定义:多个事务并发执行时,一个事务的执行不应影响其他事务的执行。


(4)持久性

定义:事务一旦提交,其结果就是永久性的,即使系统故障也不会丢失。

实现原理:通过redo log(重做日志)实现。

3、事务的四种隔离级别

隔离级别名称定义

读未提交(READ UNCOMMITTED)

最低级别,事务可以读取未提交的数据,可能导致脏读

读已提交(READ COMMITTED)

提高了数据一致性,事务只能读取已提交的数据,但仍可能导致不可重复读

可重复读(REPEATABLE READ)

默认级别,确保在同一事务中多次查询同一数据的结果相同,避免不可重复读,但可能导致幻读

串行化(SERIALIZABLE)

最高级别,强制事务串行执行,完全避免脏读、不可重复读与幻读,但相应地降低并发性
问题类型描述各隔离级别能否解决
脏读(Dirty Read)读取到其他事务未提交的数据RU允许,RC/RR/SERIALIZABLE解决
不可重复读同一事务内两次读取同一数据结果不同RR/SERIALIZABLE解决
幻读(Phantom)同一事务内两次查询返回不同行数SERIALIZABLE完全解决,RR部分解决

4、MVCC多版本并发控制协议

MVCC(多版本并发控制)是数据库管理系统中的关键技术,它通过数据版本管理显著提升了并发性能和读取效率。该技术通过为每个事务创建数据快照,使事务始终看到开始时的数据状态,从而实现了无冲突的并发读取。即便其他事务在此期间修改数据,当前事务仍能保持数据视图的一致性。这种机制完美平衡了数据一致性和系统性能需求,尤其适用于高并发查询场景,已成为主流数据库系统的核心特性之一。

三、索引

1、什么是索引

索引是数据库中用于加速查询的一种数据结构,它允许快速查找数据而不是对整个表进行扫描。

2、索引按功能分类

(1)普通索引:最基本的索引,无特殊约束

(2)唯一索引:确保索引列的值唯一

(3)主键索引:特殊的唯一索引,不允许 NULL 值

(4)复合索引:多个列组合的索引

3、什么是索引覆盖和回表查询

  • 索引覆盖:当索引包含查询所需的所有字段时,MySQL可以直接从索引中获取数据,无需访问数据行。
  • 回表查询:需要根据索引查找到主键后,再通过主键查询完整数据。

4、什么是最左匹配原则

MySQL 在利用复合索引(多列索引)时,会从索引的最左列开始向右匹配,直到遇到范围查询(>、<、like、between等)就停止匹配。

5、MySQL 索引失效的常见场景

(1)复合索引未遵循最左匹配原则。

(2)对列使用函数或运算符。

SELECT * FROM users WHERE YEAR(create_time) = 2023;  -- 对列使用函数
SELECT * FROM products WHERE price * 2 > 100;       -- 对列进行运算

(3)隐式类型转换。

-- user_id 是字符串类型
SELECT * FROM users WHERE user_id = 123;  -- 数字与字符串比较

(4)复合索引不能使用不等于(!=或<>)或 is null(is not null),否则索引失效。

(5)like尽量以常量开头,不要以%开头,否则索引失效

(6)尽量不要使用or,否则索引失效。

四、锁

1、按锁粒度分类

锁类型描述存储引擎支持特点
表锁锁定整张表所有引擎支持开销小、加锁快,但并发度低
行锁锁定表中的单行记录仅InnoDB支持开销大、加锁慢,但并发度高
页锁锁定数据页(BDB引擎支持)仅BDB支持(已基本淘汰)介于表锁和行锁之间

2、按锁模式分类

锁模式简称描述兼容性
共享锁(S)S锁允许其他事务读但不可写与共享锁兼容,与排他锁互斥
排他锁(X)X锁禁止其他事务加任何锁与其他所有锁都互斥

五、优化

1、针对千万级数据表的性能优化

(1)索引优化:建立合适索引,使用复合索引遵循最左前缀原则。

(2)表结构优化:将大字段拆分到单独表,使用合适的数据类型。

(3)查询优化:使用EXPLAIN分析执行计划

-- 传统分页(性能差)
SELECT * FROM table LIMIT 1000000, 20;-- 优化分页(使用索引覆盖)
SELECT * FROM table 
WHERE id > (SELECT id FROM table ORDER BY id LIMIT 1000000, 1)
LIMIT 20;

(4)架构层优化:读写分离、分库分表、使用Redis缓存热点数据、非实时操作走消息队列

六、MySQL 的组复制

1、什么是MySQL Group Replication?它与传统主从复制有什么区别?

Group Replication是MySQL官方提供的基于Paxos协议的高可用解决方案。

区别:

  • 传统复制:主从架构,单向复制

  • Group Replication:多主/单主模式,组内节点平等,自动故障转移



2、Group Replication如何保证数据一致性

(1)基于Paxos协议实现分布式一致性

(2)事务提交需要得到大多数节点认证

(3)使用GTID保证事务全局有序

3、当Group Replication出现脑裂问题时如何解决?

  • 手动干预选择主分区

  • 使用group_replication_force_members强制重新配置组成员

  • 确保网络分区恢复后重新同步数据

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF学习笔记(12)下拉框控件ComboBox与数据模板

下拉框控件ComboBox与数据模板 一、ComboBox1. ComboBox概述2. ItemsControl类3. Selector类4. ComboBox类 二、ComboBox数据模板总结 一、ComboBox 1. ComboBox概述 ComboBox类代表一个有下拉列表的选择控件&#xff0c;供用户选择。 官方文档&#xff1a;https://learn.mic…

Docker for Windows 设置国内镜像源教程

在使用 Docker 时&#xff0c;由于默认的 Docker Hub 镜像源位于国外&#xff0c;国内用户在拉取镜像时可能会遇到速度慢或连接不稳定的问题。为了加速镜像拉取&#xff0c;可以将 Docker 配置为使用国内镜像源。以下是适用于 Windows 系统的详细配置方法&#xff1a; 方法一&…

一键部署AI工具!用AIStarter快速安装ComfyUI与Stable Diffusion

AIStarter部署AI工具&#xff0c;让AI开发更简单&#xff01;无需研究复杂环境配置&#xff0c;AIStarter平台提供一键安装ComfyUI和Stable Diffusion&#xff0c;支持多版本选择&#xff0c;快速上手。以下是详细步骤&#xff1a; 一、访问AIStarter市场 下载AIStarter&#x…

Python基础(吃洋葱小游戏)

下面我将为你设计一个"吃洋葱小游戏"的Python实现方案&#xff0c;使用Pygame库开发。这个游戏模拟吃洋葱的过程&#xff0c;玩家需要收集不同种类的洋葱以获得高分&#xff0c;同时避免吃到辣椒。 &#x1f9c5; 吃洋葱小游戏 - Python实现方案 &#x1f3ae; 1. …

Objective-C 路由表原理详解

在 Objective-C 中实现路由表是组件化架构的核心&#xff0c;它通过 URL 映射机制实现模块间解耦通信。以下是完整实现原理&#xff1a; 一、核心架构设计 #mermaid-svg-5jMinPiZe8mivAbi {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fil…

通过交互式网页探索传输现象-AI云计算数值分析和代码验证

传输过程涉及质量、动量和能量等物理量在各种系统中的基本运动和转移&#xff0c;主要分为动量传输、热量传输和质量传输&#xff0c;在工程、环境科学、生物学和物流等领域至关重要。 传输过程是指物理量&#xff08;如质量、动量和能量&#xff09;在物理、化学、生物或工程系…

使用Rust原生实现小波卡尔曼滤波算法

一、算法原理概述小波变换&#xff08;Wavelet Transform&#xff09;通过多尺度分解将信号分为高频&#xff08;细节&#xff09;和低频&#xff08;近似&#xff09;部分&#xff0c;高频通常包含噪声&#xff0c;低频保留主体信息。使用Haar小波&#xff08;计算高效&#x…

leetcode 3304. 找出第 K 个字符 I 简单

Alice 和 Bob 正在玩一个游戏。最初&#xff0c;Alice 有一个字符串 word "a"。 给定一个正整数 k。 现在 Bob 会要求 Alice 执行以下操作 无限次 : 将 word 中的每个字符 更改 为英文字母表中的 下一个 字符来生成一个新字符串&#xff0c;并将其 追加 到原始的…

数字人分身+矩阵系统聚合+碰一碰发视频: 源码搭建-支持OEM

以下是关于数字人分身、矩阵系统聚合及碰一碰发视频功能的源码搭建与OEM支持的方案整理&#xff1a;核心技术模块数字人分身技术 使用深度学习框架&#xff08;如PyTorch或TensorFlow&#xff09;训练生成对抗网络&#xff08;GAN&#xff09;或变分自编码器&#xff08;VAE&am…

【LeetCode 热题 100】189. 轮转数组——(解法一)额外数组

Problem: 189. 轮转数组 题目&#xff1a;给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 文章目录 整体思路完整代码时空复杂度时间复杂度&#xff1a;O(N)空间复杂度&#xff1a;O(N) 整体思路 这段代码旨在解决一个经典的…

【PyCharm 2025.1.2配置debug】

大家先看下我的配置 1.调试配置 选择 FastAPI 框架名称-》 自定义应用程序文件&#xff1a;必须选择当前项目的main.pyUvicorn 选项&#xff1a;这是启动命令&#xff0c;有第三步的选择 main.py 所以只需要–reload即可&#xff0c;如果想自定义启动端口补充–port xxxxPytho…

Python数据库软件:查询与预测功能集成系统

Python数据库软件:查询与预测功能集成系统 概述 本文将详细介绍一个具备查询和模型预测功能的Python数据库软件的设计与实现。该系统基于Python开发,使用Excel作为数据存储格式,包含约15个功能页面,支持数据管理、查询分析、模型预测等核心功能。 系统架构 技术栈 核心…

什么是持续集成/持续交付(CI/CD)?

基本概念 CI/CD旨在通过自动化流程提高代码质量、加快发布速度 CI &#xff08;Continuous Integration&#xff0c;持续集成&#xff09;CD&#xff08;Continuous Delivery/Deployment&#xff0c;持续交付/持续部署&#xff09; CI 持续集成 目标 频繁加粗样式将代码合…

核弹级漏洞

CVE-2025-6018 漏洞介绍&#xff1a; 该漏洞是Linux PAM&#xff08;可插拔认证模块&#xff09;中的一个本地权限提升漏洞&#xff0c;主要存在于openSUSE Leap 15和SUSE Linux Enterprise 15的PAM配置中。由于PAM规则错误地将检查条件设置为用户存在SSH或TTY会话&#xff0c…

LabVIEW自动扶梯振动监测

利用LabVIEW开发平台构建自动扶梯机械振动数据采集系统&#xff0c;实现驱动主机、减速器、梯级等关键部位的振动信号实时采集、频谱分析、数据存储及故障特征提取。系统通过加速度传感器与高速数据采集卡的协同工作&#xff0c;结合 LabVIEW 图形化编程的高效数据处理能力&…

PTA最少交换次数

最少交换次数 分数 15 作者 計科G隊長 单位 重庆大学 长度为N的数组中只有1&#xff0c;2&#xff0c;3三种值&#xff0c;要按升序排序&#xff0c;并且只能通过数值间的两两交换实现不能移位。比如某项竞赛的优胜者按金银铜牌排序&#xff0c;或者荷兰国旗问题都是该问题…

LiteHub中间件之跨域访问CORS

跨域访问CORS 原理基本概念简单请求非简单请求&#xff08;预检请求&#xff09; 代码实现服务器端Cors的关键配置服务端解析预检请求服务端填充响应 抓包分析 原理 基本概念 在浏览器安全模型中&#xff0c;同源策略是最重要的安全基石。 一个“域”是由3个要素组成的&#…

FastAPI开发教程

FastAPI 是一个现代、高性能的 Python Web 框架&#xff0c;专为构建 APIs 设计。它基于 Python 类型提示&#xff0c;支持异步编程&#xff0c;并提供自动生成的交互式文档&#xff08;Swagger UI 和 ReDoc&#xff09;。以下是 FastAPI 开发的核心指南&#xff1a; 1. 安装 …

基于Spring Boot + MyBatis-Plus + Thymeleaf的评论管理系统深度解析

你好呀&#xff0c;我是小邹。 个人博客系统日渐完善&#xff0c;现在的文章评论以及留言数量逐渐增多&#xff0c;所以今天重构了管理后台的评论列表&#xff08;全量查询 -> 分页条件搜索&#xff09;。 示例图 网页端手机端一、系统架构设计与技术选型 系统采用前后端分离…

sqlmap学习笔记ing(1.Easy_SQLi(时间,表单注入))

题解 根据题目提示&#xff0c;应为SQL注入&#xff0c;题目页面只有一个表单&#xff0c;用sqlmap进行表单注入。 使用--forms参数进行自动化表单注入&#xff0c;逐步得到flag。 ### 总结参数作用&#xff1a; -u 指定目标URL。 -C 指定列名&#xff08;多个…