1. SELECT 语句完整的执行顺序
难度:⭐
顺序:
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT
2. MySQL事务
难度:⭐⭐
- ACID:原子性、一致性、隔离性、持久性
- 隔离级别:读未提交、读已提交、可重复读(默认)、串行化
- 实现 :通过
undo log(回滚)、redo log(持久性)、MVCC(多版本并发控制)
3. MyISAM和InnoDB的区别
难度:⭐
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 事务 | 不支持 | 支持 |
| 锁粒度 | 表级锁 | 行级锁 |
| 外键 | 不支持 | 支持 |
| 索引结构 | 非聚簇索引 | 聚簇索引 |
| 崩溃恢复 | 较差 | 较好 |
4. 悲观锁和乐观锁的怎么实现
难度:⭐⭐
- 悲观锁 :使用
SELECT ... FOR UPDATE锁定数据,认为冲突高 - 乐观锁 :通过版本号(
version字段)或时间戳,更新时检查版本号是否变化
5. 聚簇索引与非聚簇索引区别
难度:⭐⭐
- 聚簇索引:叶子节点存储整行数据,每表只能一个(通常是主键)
- 非聚簇索引:叶子节点存储主键值,需回表查询数据
6. 什么情况下mysql会索引失效
难度:⭐
- 使用
!=、<>、IS NULL(部分情况) - 对索引列使用函数或表达式(如
WHERE DATE(create_time)=...) - 隐式类型转换(如
varchar字段传入数字) - 联合索引未遵循最左前缀原则
- 全表扫描比索引快(数据量少)
7. B+tree 与 B-tree区别
难度:⭐⭐
- B-tree:叶子节点和非叶子节点都存储数据
- B+tree:数据仅存储在叶子节点,非叶子节点只存索引,叶子节点间有链表,更适合范围查询和磁盘I/O
8. 以MySQL为例Linux下如何排查问题
难度:⭐⭐
show processlist查看当前连接与执行状态show variables like '%slow%'查看慢查询配置mysqldumpslow分析慢查询日志top/htop查看CPU/内存dstat/iostat查看磁盘I/Operf top或pt-query-digest分析性能
9. 如何处理慢查询
难度:⭐⭐
- 开启慢查询日志(
slow_query_log) - 用
mysqldumpslow或pt-query-digest分析慢SQL - 使用
EXPLAIN查看执行计划 - 优化索引、避免全表扫描
- 重构SQL、拆分复杂查询
10. 数据库分表操作
难度:⭐
- 垂直分表:按字段拆分,常用字段与冷字段分离
- 水平分表:按规则(如取模、范围)将数据分散到多张结构相同的表中
- 配合中间件(如ShardingSphere)或应用层路由
11. MySQL优化
难度:⭐
- 合理设计索引
- 避免
SELECT * - 控制连接数、调整
buffer_pool大小 - 分库分表
- 使用读写分离
- 定期分析表(
ANALYZE TABLE)
12. SQL语句优化案例
难度:⭐
优化前:
sql
SELECT * FROM orders WHERE DATE(create_time) = '2025-01-01';
优化后:
sql
SELECT * FROM orders WHERE create_time >= '2025-01-01' AND create_time < '2025-01-02';
原因: 避免在索引列上使用函数,使索引生效。
13. 你们公司有哪些数据库设计规范
难度:⭐
- 表名、字段名小写+下划线
- 每张表必须有主键(自增或UUID)
- 禁止
SELECT * - 字段设置
NOT NULL并提供默认值 - 使用
InnoDB引擎 - 关键业务表必须加注释
14. 有没有设计过数据表?你是如何设计的
难度:⭐
- 明确业务需求与实体关系
- 确定表结构、字段类型、长度
- 设计主键、索引(联合索引遵循最左前缀)
- 考虑扩展性与分表策略
- 添加必要约束(唯一、外键)
- 评审SQL执行计划,提前优化
15. 常见面试SQL
难度:⭐
- 查询每个部门薪资最高的员工
- 查找重复记录
- 连续登录天数
- 行转列(
CASE WHEN) - 自连接查询上下级
示例:
sql
-- 每个部门薪资最高
SELECT d.name, e.name, e.salary
FROM employee e
JOIN department d ON e.dept_id = d.id
WHERE (e.dept_id, e.salary) IN (
SELECT dept_id, MAX(salary)
FROM employee
GROUP BY dept_id
);