问题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、排查故障,才能把底层知识转化为实战能力。