news 2026/4/15 16:19:22

MySQL 经典15问

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 经典15问

问题1:为什么项目不能用Map或文本文件存数据,非要用数据库?

刚入行的小闵用Java的Map存学生信息,服务器重启后500条数据全丢——因为内存数据不持久化;换成文本文件存储后,又要为甲方的每一个查询需求写大量冗余代码,效率极低。

数据库的核心价值正是解决这两个痛点:一是数据持久化(存到硬盘,断电不丢),二是高效管理数据(快速查询、筛选、统计,无需手动写复杂逻辑),还能实现多服务器数据共享、精准权限控制,是后端项目的必备工具。

问题2:数据库分哪两类?新手该选哪种?

数据库主要分两大类:关系型数据库(如MySQL、Oracle)和非关系型数据库(如Redis、MongoDB)。关系型数据库适合存储有明确关联的数据(比如学生-班级-课程),数据结构规整,支持事务和关联查询;非关系型数据库结构灵活,适合高并发场景或非结构化数据(比如用户评论)。对新手来说,优先选MySQL——它主流、开源、易入门,社区资源丰富,能覆盖大部分项目场景(管理系统、电商、教育平台等)。

问题3:MySQL里的数据库、表、记录、字段是什么关系?

MySQL的核心层级很清晰:首先是数据库管理系统(DBMS) ,也就是MySQL软件本身,负责管理所有数据;一个MySQL系统能管理多个数据库(DB) ,比如每个项目对应一个独立数据库(如school库),互不干扰;一个数据库里包含多张数据表(Table) ,用来分类存储数据(如student表存学生信息,class表存班级信息);每张表由一行行记录(Row) 组成,一行就是一条完整数据(比如一个学生的学号、姓名、成绩);每一列是字段(Column) ,有明确的名称和类型(如姓名字段是文本类型,年龄是整数类型)。

问题4:关系型数据库的表之间,有哪些关联关系?

表之间的关联是关系型数据库的核心,主要分三类:一对一(比如学生表和学生档案表,一个学生仅对应一份档案)、一对多(比如班级表和学生表,一个班级包含多个学生,通过“外键”关联)、多对多(比如学生表和课程表,一个学生可选多门课,一门课可被多个学生选,需通过“中间表”存储关联关系)。这些关联能让数据形成完整的业务逻辑,比如通过学生关联查询到所属班级和选修课程。

问题5:创建数据表时,为什么要加“约束”?常见约束有哪些?

约束的作用是保证数据的准确性和完整性,避免出现无效或错误数据。常见约束包括:主键(PRIMARY KEY) ,每条数据的唯一标识,非空且唯一,建议用独立id字段并设为自增;非空约束(NOT NULL) ,字段必须赋值(比如姓名、学号不能为空);唯一约束(UNIQUE) ,字段值不能重复(比如学号、手机号);外键(FOREIGN KEY) ,建立表间关联,确保数据关联合法(比如学生表的class_id不能对应不存在的班级)。

问题6:怎么操作MySQL数据库?用什么语言?

操作MySQL的通用语言是SQL(结构化查询语言) ,核心能实现“增删改查”(CRUD)、数据统计、表结构修改等所有操作。不同数据库的SQL核心语法通用,仅少量“方言差异”(比如MySQL用LIMIT分页,Oracle用ROWNUM)。比如查询1班分数≥90的学生、统计每个班级的平均成绩、批量插入学生数据,都能通过SQL快速实现。

常用SQL示例(可直接复制执行)

-- 1. 创建数据库(指定字符集,避免中文乱码)

CREATE DATABASE IF NOT EXISTS school DEFAULT CHARACTER SET utf8mb4;

-- 2. 创建学生表(带约束)

CREATE TABLE IF NOT EXISTS student (

id INT PRIMARY KEY AUTO_INCREMENT,

student_no VARCHAR(10) UNIQUE NOT NULL,

name VARCHAR(20) NOT NULL,

class_id INT,

score DECIMAL(5,2) CHECK (score >=0 AND score <=100),

FOREIGN KEY (class_id) REFERENCES class(id)

);

-- 3. 插入数据

INSERT INTO student (student_no, name, class_id, score)

VALUES ('2024001', '张三', 1, 95.5), ('2024002', '李四', 2, 88.0);

-- 4. 查询数据(1班分数≥90的学生)

SELECT name, score FROM student WHERE class_id=1 AND score>=90;

-- 5. 批量更新成绩(所有学生加5分)

UPDATE student SET score = score + 5;

问题7:用Java代码怎么操作MySQL?一定要写复杂SQL吗?

Java原生通过JDBC操作MySQL,步骤很繁琐:加载驱动→建立连接→编写SQL→执行操作→关闭连接,还得手动处理SQL语法。实际开发中更常用ORM框架(对象关系映射),能把数据库表映射成Java对象,像操作对象一样操作数据库。比如MyBatis框架简化SQL编写,MyBatis Plus/MyBatis Flex更是开箱即用,连SQL都不用写,几行代码就能实现增删改查,不过复杂查询仍需手动编写。

问题8:数据量变大后查询变慢?怎么解决?

小闵的系统上线后,查询某个班级的学生要等好几秒,原因是数据库默认“全表扫描”(逐行查找)。解决办法是加索引——索引就像书的目录,能让数据库快速定位数据,查询速度从“秒级”降至“毫秒级”。

但索引不是越多越好:适合给高频查询、值区分度高的字段(如班级编号、学号)加索引;低频查询、值区分度低的字段(如性别)、更新频繁的字段不适合加,否则会增加写入开销和存储空间。

索引操作示例

-- 给班级字段加普通索引

CREATE INDEX idx_student_class ON student(class_id);

-- 给班级+分数加联合索引(遵循“最左前缀原则”)

CREATE INDEX idx_class_score ON student(class_id, score);

-- 删除索引

DROP INDEX idx_student_class ON student;

问题9:批量操作数据时,部分成功部分失败怎么办?

小闵批量给学生成绩加5分时,因网络波动导致部分学生加分成功、部分失败,这是典型的数据一致性问题。解决方案是用事务——事务将多个操作捆绑为“不可分割的单元”,要么全部成功,要么全部失败。事务有ACID四大特性:原子性(不可拆分)、一致性(数据完整)、隔离性(并发不干扰)、持久性(提交后永久保存)。在Spring框架中,只需加@Transactional注解,框架就会自动管理事务,异常时自动回滚。

事务使用示例(Spring框架)

import org.springframework.transaction.annotation.Transactional;

@Transactional // 加注解即可开启事务

public void batchAddScore(int addScore) {

// 批量更新成绩(失败会自动回滚)

studentMapper.updateScore(addScore);

}

问题10:MySQL还有哪些高级特性?实际开发中常用吗?

MySQL的高级特性包括视图、存储过程、触发器:视图是虚拟表,基于查询结果创建(如“高分学生视图”),能简化复杂查询、隐藏敏感字段;存储过程是预编译的SQL集合,可批量执行操作(如批量更新数据),减少网络传输;触发器是表上的“自动触发程序”(如插入学生后自动记录日志),实现数据自动同步或校验。这些特性在实际开发中用得不多,简单了解即可,按需使用。

问题11:生产环境数据库卡死?怎么排查和解决?

小闵的系统后期出现“操作超时、数据库卡死”,罪魁祸首是“慢查询”——部分SQL执行时间长达几十秒,霸占数据库连接和CPU资源,导致连接池耗尽。排查方法:一是开启慢查询日志(记录执行时间超过阈值的SQL),二是用EXPLAIN命令分析SQL,查看是否使用索引、是否全表扫描。优化无索引或索引失效的SQL后,就能解决卡死问题。

慢查询排查示例

-- 开启慢查询日志(执行时间>1秒的SQL)

SET GLOBAL slow_query_log = 'ON';

SET GLOBAL long_query_time = 1;

-- 分析SQL执行计划(查看是否使用索引)

EXPLAIN SELECT * FROM student WHERE class_id=1;

问题12:服务器硬盘损坏导致数据丢失?怎么恢复?

数据丢失不用慌,关键是提前做好“全量备份+增量备份”:全量备份用mysqldump工具每天凌晨备份整个数据库,备份文件存到异地服务器(避免本地硬盘损坏);增量备份开启binlog日志,记录每一次数据修改操作。恢复时,先导入全量备份文件,再通过binlog日志恢复到最新状态,就能找回丢失的数据。

备份与恢复示例(命令行)

# 全量备份school数据库

mysqldump -u root -p school > school_backup_2024.sql

# 恢复数据库

mysql -u root -p school < school_backup_2024.sql

问题13:怎么避免数据库宕机?万一宕机了怎么办?

为防止数据库单点故障,可搭建“一主多从”高可用架构:主库负责写操作(新增、修改、删除),通过binlog记录数据变更;从库同步主库数据,负责读操作(查询、统计),实现“读写分离”,提升并发能力。当主库宕机时,通过MHA等工具自动将从库升级为主库,实现故障自动切换,保证系统不间断运行。

问题14:数据量太大,一个库/表存不下怎么办?

当数据量超出单个库或表的存储上限时,需进行分库分表:水平拆分是把同一张表的数据按规则分散到多个表/库(如学生表按年级拆分);垂直拆分是按业务功能拆分数据库(如将学生基本信息和选课信息存到不同库)。通过分库分表,就能支撑海量数据的存储和查询。

问题15:想深入学MySQL底层原理,该怎么学?

学习底层原理不用死背知识点,核心是“带着问题学”:比如“MySQL如何实现高效查询?”“为什么两条语法不同但逻辑一致的SQL执行速度一样?”(答案是查询优化器会转化为相同逻辑结构)。学习方法:一是刷MySQL面试题,聚焦实际应用场景;二是看书,《MySQL是怎样运行的》(入门)、《高性能MySQL》(进阶)都是经典;三是多实操,优化SQL、排查故障,才能把底层知识转化为实战能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 7:48:06

【大模型微调】30-微调实战指导:提供全量训练与轻量训练的选择建议及适用场景分析

引言在人工智能领域&#xff0c;模型微调是一项关键技术&#xff0c;它使得预训练模型能够适应特定任务&#xff0c;从而提高模型的性能和适用性。随着大模型时代的到来&#xff0c;如何高效地进行模型微调成为了研究者和实践者关注的焦点。本文将深入探讨全量训练与轻量训练两…

作者头像 李华
网站建设 2026/4/12 0:32:44

微观交通流仿真软件:AIMSUN_(5).交通需求建模

交通需求建模 1. 交通需求建模概述 交通需求建模是交通仿真中的一个核心步骤&#xff0c;它涉及将实际的交通流量、出行模式和交通特性转换为仿真模型中的输入数据。通过这些模型&#xff0c;可以预测和分析不同交通管理和规划措施的效果。在AIMSUN中&#xff0c;交通需求建模主…

作者头像 李华
网站建设 2026/4/15 15:24:21

`Set`、`Map`、`WeakSet` 和 `WeakMap` 的区别与使用场景

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

作者头像 李华
网站建设 2026/4/14 2:59:22

LabVIEW信号彩图Colormap

以彩图呈现模拟信号或实测数据&#xff08;实测数据由 Log Data VI 采集&#xff09;&#xff0c;通过切换标签页选信号源&#xff0c;配置采样 / 转速等参数&#xff08;模拟&#xff09;或加载文件&#xff08;实测&#xff09;&#xff0c;设定绘图类型后运行&#xff0c;可…

作者头像 李华