本文汇总了 MySQL 面试中的高频知识点,覆盖增删查改(CRUD)、索引、事务、存储引擎、日志、隔离级别、主从复制、备份恢复、数据迁移以及高可用架构等核心主题,并结合实际运维场景给出可落地的命令与方案。无论你是正在准备后端开发面试的工程师,还是希望夯实基础、提升排障能力的初级 DBA,都可以把本文作为一份系统性的复习提纲,按章节逐项对照自查,查漏补缺。
1、查看当前库和表的命令
查看当前数据库:
SELECT DATABASE(); -- 查看当前所在库 SHOW DATABASES; -- 查看所有数据库 USE database_name; -- 切换数据库查看当前表:
SHOW TABLES; -- 查看当前库所有表 SHOW TABLES FROM db_name; -- 查看指定库的所有表 DESC table_name; -- 查看表结构 SHOW CREATE TABLE table_name; -- 查看建表语句 SHOW TABLE STATUS; -- 查看表状态信息(引擎、行数等)2、MySQL的增删查改命令(CRUD)
增(INSERT):
-- 插入单条 INSERT INTO users (name, age) VALUES ('张三', 20); -- 插入多条 INSERT INTO users (name, age) VALUES ('李四', 25), ('王五', 30); -- 插入查询结果 INSERT INTO users_backup SELECT * FROM users WHERE age > 18;删(DELETE/TRUNCATE):
-- 条件删除(可回滚,记录日志) DELETE FROM users WHERE id = 1; -- 清空表(快速,不可回滚,不记录单行日志) TRUNCATE TABLE users; -- 删除表结构 DROP TABLE users;查(SELECT):
-- 基础查询 SELECT * FROM users WHERE age > 20 ORDER BY id DESC LIMIT 10; -- 聚合查询 SELECT dept_id, AVG(salary) as avg_sal FROM employees GROUP BY dept_id HAVING avg_sal > 5000; -- 联表查询 SELECT u.name, o.order_no FROM users u LEFT JOIN orders o ON u.id = o.user_id;改(更新):
-- 单表更新 UPDATE users SET age = age + 1 WHERE id = 1; -- 多表关联更新 UPDATE users u JOIN orders o ON u.id = o.user_id SET u.last_order_time = o.create_time WHERE o.status = 'completed';3、索引的作用是什么? 有哪些类型?
答:索引是帮助MySQL高效获取数据的数据结构,主要作用是加快查询速度,同时也会影响写入性能(需要维护索引树)。具体来说,索引相当于一本书的目录,通过建立索引,MySQL可以避免全表扫描,直接从索引结构中定位到目标数据所在的位置,从而大幅减少磁盘IO和CPU开销。在数据量较小(如几千行)时,全表扫描和索引查询的差距并不明显;但当表数据量达到百万级甚至更高时,索引带来的性能提升往往是数量级的。不过,索引并非越多越好:每次执行INSERT、UPDATE、DELETE操作时,MySQL都需要同步维护索引树,导致写入性能下降;同时索引本身也会占用额外的磁盘空间。因此,在实际设计中需要结合查询频率、写入压力和存储成本,合理选择需要建立索引的列,避免为不常用的列盲目添加索引。
索引类型详解:
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 主键索引 | 唯一非空,每张表只有一个 | 主键列 |
| 唯一索引 | 列值必须唯一,允许NULL | 手机号、邮箱等唯一字段 |
| 普通索引 | 无唯一性约束 | 频繁查询的非唯一字段 |
| 组合索引 | 多列联合索引,遵循最左前缀原则 | 多条件查询(其中 a=1 且 b=2) |
| 全文索引 | 针对文本内容的分词索引 | 大文本搜索(MyISAM支持更好) |
| 覆盖索引 | 查询字段都在索引中,无需回表 | 高频查询优化 |
索引数据结构:
- B+树索引(InnoDB默认):支持范围查询,叶子节点存储数据
- Hash索引:精确匹配快,不支持范围查询(Memory引擎支持)
索引失效场景:
- 在索引列上使用函数或运算(
WHERE YEAR(create_time) = 2024)- 前导模糊查询(
LIKE '%abc')- 隐式类型转换(字符串列用数字查询)
- 违反最左前缀原则(组合索引未用第一列)
- 使用
OR条件且部分列无索引
4、简述下MySQL中的事务
答:事务(Transaction)是数据库操作的基本逻辑单位,由一组SQL语句组成,保证这些操作要么全部成功提交,要么全部失败回滚,以此维护数据的完整性和一致性。
事务的生命周期:
START TRANSACTION; -- 或 BEGIN -- 执行SQL操作 UPDATE account SET balance = balance - 100 WHERE id = 1; UPDATE account SET balance = balance + 100 WHERE id = 2; -- 检查业务规则 IF (满足条件) THEN COMMIT; -- 提交,永久生效 ELSE ROLLBACK; -- 回滚,恢复原状 END IF;事务的使用场景:
- 银行转账(扣款+入账必须同时成功)
- 订单创建(订单表+库存表+日志表同时更新)
- 批量数据处理(保证数据一致性)
5、事务的ACID四大特性
答:ACID是事务的四个核心特性:
| 特性 | 英文 | 核心含义 | 实现机制 |
|---|---|---|---|
| 原子性 | 原子性 | 事务是最小执行单位,不可再分,要么全成功要么全失败 | 撤销日志(回滚日志) |
| 一致性 | 一致性 | 事务执行前后,数据库从一个合法状态变为另一个合法状态 | 约束检查+其他三大特性共同保证 |
| 隔离性 | 隔离 | 多个事务并发执行时,彼此互不干扰 | MVCC(多版本并发控制)+ 锁机制 |
| 持久性 | 耐久性 | 事务一旦提交,数据永久保存,即使系统故障 | Redo Log(重做日志)+ Binlog |
详细解析:
- 原子性:通过Undo Log实现,记录修改前的数据,用于失败时回滚
- 隔离性:通过MVCC和锁实现,避免脏读、不可重复读、幻读
- 持久性:通过Redo Log实现WAL(Write-Ahead Logging),先写日志再刷盘
6、InnoDB和MyISAM存储引擎的区别
答:
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✅ 支持ACID | ❌ 不支持 |
| 锁粒度 | 行级锁(高并发) | 表级锁(并发低) |
| 外键 | ✅ 支持 | ❌ 不支持 |
| 崩溃恢复 | ✅ 支持(Redo Log) | ❌ 不支持 |
| 全文索引 | 5.6+支持 | ✅ 原生支持 |
| 存储空间 | 较高(聚簇索引) | 较低(非聚簇索引) |
| 适用场景 | 高并发、事务型业务(OLTP) | 读密集型、日志分析(OLAP) |
关键区别详解:
InnoDB核心优势:
- 聚簇索引:数据按主键顺序存储,主键查询极快
- MVCC:实现非阻塞读,提升并发性能
- Buffer Pool:缓存数据和索引,减少磁盘IO
MyISAM适用场景:
- 只读或读多写少的场景(如数据仓库)
- 需要全文检