资深面试题之MySQL问题及解答(二)

作者:360_go_php日期:2025/10/4

MySQL 是一款广泛使用的开源数据库管理系统,其提供了许多强大的功能,如事务管理、索引优化以及高级查询支持等。在面试中,面试官通常会通过一些高级 MySQL 问题来测试候选人对数据库管理、性能优化、事务隔离等方面的理解。以下是一些常见的 MySQL 资深面试问题及其解答。

​编辑---

21. MySQL 里记录货币用什么字段类型好?

在 MySQL 中,记录货币类型的数据建议使用 DECIMALNUMERIC 类型。DECIMAL 类型用于存储精确的数字,特别是对于涉及小数的货币数据,能够避免浮动的精度问题。例如,DECIMAL(10, 2) 可以存储总共 10 位数字,其中 2 位为小数部分,适合存储货币。

​编辑

1DECIMAL(10, 2) -- 允许存储最多 10 位数字,其中 2 位为小数部分  
2```![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/62da71bda37a4ed798920d4559d6e336~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1760101947&x-signature=mrT3vRjJi8OuMeoI%2F5bQ%2FnLWcdw%3D)![](<> "点击并拖拽以移动")​编辑
3
4---
5
6### 22. **MySQL 有关权限的表都有哪几个?**
7
8MySQL 有几个与权限相关的表,主要存储在 `mysql` 系统数据库中:
9
10- **user**:存储全局用户权限信息。  
11- **db**:存储数据库级别的权限信息。  
12- **tables_priv**:存储表级权限信息。  
13- **columns_priv**:存储列级权限信息。  
14- **procs_priv**:存储存储过程和函数权限。  
15- **host**:存储与主机相关的权限信息。
16
17---
18
19### 23. **列的字符串类型可以是什么?**
20
21在 MySQL 中,常见的字符串数据类型包括:
22
23- **CHAR**:固定长度字符串。存储定长字符,定义时指定长度。  
24- **VARCHAR**:变长字符串。适用于存储不同长度的字符数据。  
25- **TEXT**:适用于存储长文本数据。  
26- **TINYTEXT**、**MEDIUMTEXT**、**LONGTEXT**:这三种类型分别用于存储不同长度的文本数据。  
27- **BLOB**(Binary Large Object):用于存储二进制数据。  
28- **ENUM**:用于存储预定义的字符串集合,类似于枚举类型。
29
30---
31
32### 24. **MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?**
33
34优化方法包括:
35
36- **分区表**:根据日期或某些业务逻辑,将数据分区存储,这样可以有效提高查询效率。  
37- **索引优化**:为查询字段(如时间戳、ID)创建索引。避免频繁的全表扫描。  
38- **读写分离**:通过设置主从复制架构,分担读取压力。  
39- **数据归档**:定期清理历史数据,归档过期数据以减少活跃数据量。  
40- **查询优化**:使用合适的 SQL 查询,避免全表扫描,适当使用 `EXPLAIN` 分析查询效率。
41
42---
43
44### 25. **锁的优化策略**
45
46锁的优化策略包括:
47
48- **使用更小的事务**:通过减少事务的持续时间,降低锁的竞争。  
49- **避免锁定不必要的行**:通过精确的查询条件,只锁定需要的行。  
50- **使用合适的隔离级别**:根据需要选择合适的事务隔离级别,避免不必要的锁。  
51- **使用行级锁而非表级锁**:如果数据库支持行级锁(如 InnoDB),尽量避免表级锁。  
52- **避免死锁**:合理安排事务执行顺序,避免两个或多个事务因相互持有锁而陷入死锁。
53
54---
55
56### 26. **索引的底层实现原理和优化**
57
58MySQL 的索引底层实现通常使用 B+ 树(对于 InnoDB 引擎)。B+ 树是一种平衡树,所有的叶子节点都在同一层。优化方法包括:
59
60- **选择合适的字段做索引**:经常参与查询条件的字段(如 WHERE、JOIN 条件)应当做索引。  
61- **避免冗余索引**:索引越多,性能负担越大,应避免创建多余的索引。  
62- **使用联合索引**:将多个查询条件字段合并成一个联合索引,优化多条件查询。
63
64---
65
66### 27. **什么情况下设置了索引但无法使用?**
67
68以下是一些可能无法使用索引的情况:
69
70- **使用了不等于运算符(`<>``!=`)**:不等于运算符通常会导致 MySQL 放弃使用索引。  
71- **使用了 `OR` 查询**:如果 `OR` 查询中涉及多个不使用索引的条件,MySQL 可能无法有效使用索引。  
72- **函数运算**:在查询条件中使用了对索引列的函数运算(如 `YEAR(date)`),MySQL 可能无法利用索引。  
73- **不适当的索引顺序**:对于联合索引,查询条件中的字段顺序必须与索引顺序匹配,否则索引无法使用。
74
75---
76
77### 28. **实践中如何优化 MySQL**
78
79- **查询优化**:通过 `EXPLAIN` 分析查询计划,优化 SQL 查询。  
80- **合适的索引**:为查询条件中的字段建立索引,避免索引过多或过少。  
81- **数据分区**:对大数据表进行分区处理,提高查询效率。  
82- **数据库拆分**:使用数据库分库分表技术,减少单个数据库的负载。  
83- **缓存**:利用 MySQL 的查询缓存(如果适用)或其他缓存技术(如 Redis)提高查询速度。
84
85---
86
87### 29. **优化数据库的方法**
88
89- **数据库规范化**:确保数据库设计合理,避免数据冗余。  
90- **索引优化**:根据查询频繁的字段建立索引。  
91- **查询优化**:使用更简洁、更高效的查询语句,避免不必要的全表扫描。  
92- **归档历史数据**:定期清理历史数据,保持数据库的活跃数据量。  
93- **数据库分区与分表**:对于海量数据,采用分区表或分表策略。
94
95---
96
97### 30. **简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)**
98
99- **索引**:一种数据结构,帮助快速查找数据。提高读取速度,但会降低写入性能。  
100- **主键**:一种特殊的唯一索引,不能有 NULL 值。主键的存在能加速对数据的查询。  
101- **唯一索引**:确保索引列中的数据唯一,能够加速查询,但允许 NULL 值。  
102- **联合索引**:一个索引包含多个列,适用于多列查询条件,能够提高多条件查询的性能。
103
104对于 **读取性能**,索引能大幅提升查询效率,但对于 **写入性能**,每次写入或更新数据时都需要维护索引,会有性能损失。
105
106---
107
108### 31. **数据库中的事务是什么?**
109
110事务是数据库中的一组操作,它们要么全部成功执行,要么全部失败。事务具有四个特性,通常称为 ACID 特性:
111
112- **原子性(Atomicity)**:事务中的所有操作要么全部完成,要么全部回滚。  
113- **一致性(Consistency)**:事务执行前后,数据库必须处于一致性状态。  
114- **隔离性(Isolation)**:事务之间相互独立,避免相互干扰。  
115- **持久性(Durability)**:一旦事务提交,它的结果会永久保存在数据库中。
116
117---
118
119### 32. **SQL 注入漏洞产生的原因?如何防止?**
120
121SQL 注入漏洞通常是由于用户输入没有经过严格过滤和验证,导致恶意的 SQL 语句被执行。防止方法包括:
122
123- 使用 **预处理语句**(Prepared Statements)和 **参数化查询**。  
124- 过滤和转义用户输入,避免特殊字符(如 `'`)被执行。  
125- 限制数据库权限,仅授予必要的权限给应用程序。
126
127---
128
129### 33. **为表中得字段选择合适的数据库类型**
130
131选择合适的数据库字段类型对于数据库性能至关重要。应根据字段的实际需求选择类型。例如:
132
133- 使用 **INT** 或 **BIGINT** 存储数值。  
134- 使用 **VARCHAR** 存储可变长度的字符串。  
135- 使用 **DATE** 或 **DATETIME** 存储日期和时间。
136
137---
138
139### 34. **存储日期的字段类型(继续)**
140
141除了 `DATE``DATETIME``TIMESTAMP` 类型外,MySQL 还提供了:
142
143- **TIME**:存储时间(`HH:MM:SS` 格式)。  
144- **YEAR**:用于存储年份(`YYYY` 格式)。
145
146在选择存储日期和时间的字段类型时,主要考虑:
147
148- `DATE` 适用于仅需要存储日期的场景(例如出生日期、订单日期等)。  
149- `DATETIME` 适用于存储完整的日期和时间信息(例如事件的具体发生时间)。  
150- `TIMESTAMP` 会根据当前时区存储数据,并且它会自动更新,非常适合用于跟踪记录创建或更新时间。
151
152---
153
154### 35. **如何优化 MySQL 查询的性能?**
155
156优化 MySQL 查询性能的方法有很多,主要包括:
157
158- **使用合适的索引**:为常用的查询条件字段(如 WHERE 子句、JOIN 条件)创建索引,可以极大提高查询速度。  
159- **避免全表扫描**:使用索引来避免全表扫描,特别是在大表中。  
160- **查询优化**:简化查询语句,避免复杂的子查询,使用 `EXPLAIN` 来分析查询的执行计划,找出潜在的瓶颈。  
161- **分表分库**:对于大数据量表,采用分表、分库技术来减轻单个数据库的负载。  
162- **缓存机制**:使用缓存(如 Redis)来减轻数据库的压力,尤其是对于频繁访问的数据。
163
164---
165
166### 36. **MySQL 中的存储引擎及其特点**
167
168MySQL 支持多种存储引擎,常用的有:
169
170- **InnoDB**:支持事务、外键和行级锁,适用于大多数应用,特别是需要高并发和数据一致性的场景。  
171- **MyISAM**:不支持事务和外键,但查询速度较快,适用于读操作为主的应用。  
172- **Memory**:将数据存储在内存中,适用于需要高速读写操作但数据量较小的场景。  
173- **CSV**:将数据存储为 CSV 文件,适用于数据导入导出时使用。  
174- **NDB**(Cluster):用于分布式 MySQL 集群,具有高可用性和高扩展性。
175
176选择存储引擎时,需要根据应用的需求、数据量、查询类型以及性能要求来决定。
177
178---
179
180### 37. **如何处理 MySQL 数据库的死锁?**
181
182死锁是指两个或多个事务在执行过程中,因争夺资源而导致无法继续执行下去的现象。解决死锁的方法有:
183
184- **合理安排事务顺序**:确保多个事务的资源请求顺序一致,避免交叉锁定。  
185- **使用较小的事务**:尽量缩短事务的执行时间,避免持有锁的时间过长。  
186- **避免长时间持锁**:尽量在数据库中减少长时间持有锁的操作,尤其是涉及 IO 操作时。  
187- **设置合理的超时时间**:MySQL 提供了死锁检测机制,可以设置 `innodb_lock_wait_timeout` 参数来限制事务等待锁的时间,避免死锁发生。
188
189---
190
191### 38. **MySQL 中如何避免数据丢失?**
192
193避免数据丢失的方法包括:
194
195- **定期备份**:定期进行全量和增量备份,并确保备份数据的可恢复性。  
196- **启用事务日志**:InnoDB 引擎支持事务日志,通过启用 `binary log``redo log` 可以确保在系统崩溃时数据能够恢复。  
197- **主从复制**:配置主从复制架构,确保数据有备份副本,增加数据安全性。  
198- **使用双写机制**:例如使用 MySQL 的 `GTID`(全局事务标识符)机制,确保跨多个节点的事务一致性。
199
200---
201
202### 39. **MySQL 中如何实现数据的高可用性?**
203
204实现 MySQL 数据库的高可用性主要通过以下方法:
205
206- **主从复制**:通过主数据库和从数据库之间的复制机制,可以保证数据的备份和容灾能力。主数据库的所有更新操作会同步到从数据库,确保高可用。  
207- **MHA(Master High Availability)**:一个 MySQL 高可用解决方案,通过自动故障转移来实现数据库的高可用性。  
208- **PXC(Percona XtraDB Cluster)**:提供同步复制的高可用 MySQL 集群解决方案,所有节点都可以处理读写操作,具有自动故障转移和数据一致性保证。  
209- **Galera Cluster**:基于同步复制的高可用解决方案,可以在多个节点之间保证数据的一致性。
210
211通过这些高可用性方案,可以在硬件故障、网络中断等情况下减少服务的中断时间,提高系统的可靠性。
212
213214

资深面试题之MySQL问题及解答(二)》 是转载文章,点击查看原文


相关推荐


Elasticsearch MCP 服务器:与你的 Index 聊天如何在 Linux,MacOS 及 Windows 上进行安装 ElasticsearchKibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana
Elastic 中国社区官方博客2025/10/3

访问外部知识在提升 LLM 响应能力的现代 AI 工作流中起着关键作用。但高效管理 context、确保 AI agents 之间的通信,以及扩展工具以协同工作并非易事。这就是 Model Context Protocol (MCP) 的作用所在。 Model Context Protocol 是一个开放标准,使开发者能够在他们的数据源和 AI 驱动的工具之间建立安全的双向连接。其架构非常直接:开发者可以通过 MCP servers 暴露他们的数据,或者构建连接这些服务器的 AI 应用(MCP


线程池
karry_k2025/10/2

线程池 线程池就是一种池化技术,用于预先创建并管理一组线程,避免频繁创建和销毁线程的开销,提高性能和响应速度。 他的几个关键配置包括:核心线程、最大线程数、空闲存活时间、工作队列、拒绝策略 五大线程池、七个参数、四个拒绝策略 线程池相关参数解释 corePoolSize:核心线程数,即线程池中始终保持的线程数量。 maximumPoolSize:最大线程数,即线程池中允许的最大线程数量。 keepAliveTime:线程空闲时间,超过这个时间的非核心线程会被销毁。 workQueue:任务队列


Java四舍五入的艺术掌握精确浮点数处理的秘密
bendan012342025/10/2

在编程过程中,浮点数的处理一直是一个棘手的问题。无论是在财务计算、科学计算,还是游戏开发中,浮点数的精度都可能对最终结果产生重要影响。而在Java编程语言中,四舍五入操作是一项非常常见的需求。如何精确地处理浮点数,避免不必要的误差呢?本文将深入探讨Java中的四舍五入技巧,帮助开发者更好地掌握浮点数的精确处理。 1. 为什么浮点数有误差? ?? 浮点数的存储方式决定了它的精度。在计算机中,浮点数通常采用IEEE 754标准进行存储,这种存储方式无法精确表示某些十进制数。这就导致了在进


如何在项目中选择使用HTTP还是WebSocket?
歪歪10010/2/2025

HTTP和WebSocket的选择取决于通信模式和业务需求。HTTP适用于客户端主动请求、低频交互的场景,如数据查询、表单提交和静态资源加载,具有简单、兼容性好的优势。WebSocket适合需要服务器主动推送、高频实时交互的应用,如聊天、实时监控和在线游戏,支持双向通信。实际项目中可混合使用,HTTP处理普通请求,WebSocket负责实时模块。决策时需考虑服务器推送需求、数据更新频率、交互模式和开发成本,灵活选用合适技术。


2026最新版Node.js下载安装及环境配置教程【保姆级教程】
城沐小巷9/30/2025

本文介绍了Node.js的安装和环境配置全过程。首先从官网下载对应系统的安装包,按照向导完成安装后测试版本确认安装成功。接着在安装目录下创建node_global和node_cache文件夹,通过npm命令配置路径。最后设置环境变量,包括创建NODE_PATH变量和修改Path变量。测试阶段通过全局安装express模块验证配置是否成功,并提供了常见错误的解决方法。全文包含详细的操作步骤和配图说明,适合Node.js初学者完成环境搭建。


HRPC在Polaris存储系统中的应用
H3C-Navigator9/30/2025

HRPC作为Polaris分布式存储的高性能通信框架,不仅在网络传输上,在IO内存拷贝,CPU调度等方面也都做了大量的优化。为Polaris分布式存储实现高性能奠定了坚实的基础。


Python 的内置函数 ascii
IMPYLH2025/10/5

Python 内建函数列表 > Python 的内置函数 ascii ascii()函数是Python提供的一个小巧但强大的工具,它能够将任何对象转换为只包含ASCII字符的表示形式,非ASCII字符会被转义。这个函数在调试、日志记录、数据序列化等场景中特别有用,尤其是在需要确保输出只包含可打印ASCII字符的环境中。 ascii 的函数原型: def ascii(obj): ''' 转换为字符串(调用对象的 `__repr__` 方法),非 ASCII 字符将被转义


Vue 组件与插件的区别详解
excel2025/10/7

在 Vue 的开发体系中,“组件 (Component)” 与 “插件 (Plugin)” 是两个经常被提及的概念。它们都能提升开发效率与系统可维护性,但用途与设计目标截然不同。本文将通过定义、作用、实现方式与使用场景等方面,对两者进行系统梳理与对比。 一、组件是什么? 1. 定义回顾 组件是一种将图形或非图形的逻辑抽象为独立单元的开发模式。在 Vue 中,每一个 .vue 文件都可以被视为一个组件。 简单来说,组件就是一个具有独立逻辑与界面的可复用模块。 2. 组件的优势 降低系统耦合度


CentOS安装Jenkins
何中应2025/10/8

说明:之前介绍过用 Docker 的方式部署 Jenkins,本文介绍通过安装包的方式部署最新版的 Jenkins 在云服务器上安装Jenkins 第一步:准备工作 安装 Jenkins 的前提,是需要服务器有 JDK、Maven 和 Git 环境,如下: 这几个环境,参看上面的文章进行安装,最新版的 Jenkins 需要 JDK17 或 JDK21,Maven 最好装 3+ 第二步:安装启动 找一个合适的目录,下载 Jenkins 安装包 wget https://mirro


某大厂跳动面试:计算机网络相关问题解析与总结
360_go_php2025/10/10

​ 在参加像字节跳动这样的互联网公司面试时,计算机网络的知识是一个常见的考察点。以下是一些常见的计算机网络面试问题和详细解答,在面试中打下坚实的基础。 1. HTTPS通信过程 HTTPS (HyperText Transfer Protocol Secure) 是一种安全的 HTTP 协议,通过 TLS/SSL 加密实现数据的保密性和完整性。HTTPS 的通信过程包括以下几个步骤:​编辑 客户端发起连接:客户端向服务器发送请求,使用 HTTPS 协议。 服务器响应:服务器返回其 SSL/T

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0