数据库面试核心要点与SQL优化实战

数据库面试核心要点与SQL优化实战 1. 数据库面试核心要点解析作为Java技术栈的重要组成部分数据库知识在面试中的考察比重通常占到30%以上。我经历过上百场技术面试后发现数据库问题往往集中在几个经典领域掌握这些核心要点能显著提升面试通过率。2. 基础理论篇2.1 事务特性与隔离级别ACID特性是数据库事务的基石。在实际项目中我们最常遇到的是隔离级别问题。以电商系统为例读未提交Read Uncommitted会导致脏读问题读已提交Read Committed能避免脏读但可能出现不可重复读可重复读Repeatable Read是MySQL默认级别能解决不可重复读但可能有幻读串行化Serializable完全避免问题但性能最差提示面试官常会追问MVCC实现原理建议准备InnoDB的版本链机制解释2.2 索引优化实践B树索引的查询复杂度是O(log n)但要注意最左前缀原则联合索引(a,b,c)只能用于a、ab或abc查询索引失效场景使用函数操作WHERE YEAR(create_time)2023隐式类型转换varchar字段用数字查询使用!或操作符使用前导通配符LIKE %xxx实测案例某用户表2000万数据无索引的status查询耗时3.2秒添加索引后降至28毫秒。3. SQL优化实战3.1 执行计划解读EXPLAIN关键字段解读字段重点关注值优化建议typeconst ref range index ALL避免出现ALLrows预估扫描行数超过1000行需要考虑优化ExtraUsing filesort, Using temporary需要立即优化3.2 分页查询优化常规分页的问题SELECT * FROM orders LIMIT 100000, 10会导致先读取100010行再丢弃前10万行。优化方案SELECT * FROM orders WHERE id 100000 ORDER BY id LIMIT 10前提是有自增主键索引实测性能提升200倍。4. 高并发场景应对4.1 锁机制详解乐观锁适合读多写少场景通过version字段实现悲观锁SELECT...FOR UPDATE注意可能引发死锁间隙锁RR隔离级别特有防止幻读但影响并发注意分布式锁要用Redis的SETNX或Zookeeper实现数据库锁不适用分布式场景4.2 分库分表策略当单表超过500万行需要考虑拆分水平拆分按ID范围或哈希取模垂直拆分将大字段拆分到扩展表中间件选型ShardingSphere功能全面MyCat配置简单自研路由灵活性高5. 高频面试题精讲5.1 为什么用自增主键插入性能避免B树频繁分裂存储空间比UUID节省50%以上缓存友好局部性原理提升命中率例外场景需要隐藏业务量的场景可以使用雪花ID。5.2 千万级数据如何快速导入实测方案对比方法1000万数据耗时特点单条INSERT85分钟绝对不要用批量INSERT(1000条/批)4分20秒需要调整max_allowed_packetLOAD DATA INFILE1分15秒需要文件权限存储过程6分30秒灵活性高但速度一般6. 避坑指南不要使用SELECT *特别是Blob/Text字段避免在循环中执行SQL用批量操作替代大表ALTER TABLE会导致锁表用pt-online-schema-change连接池配置要合理最大连接数 (核心数 * 2) 有效磁盘数模糊查询用ES替代LIKE %xxx%必定全表扫描7. 进阶知识储备WAL机制与redo/undo日志Change Buffer优化原理索引下推优化(ICP)Buffer Pool多实例配置在线DDL实现原理我在实际面试中最常被追问的是从执行SQL到返回结果的全过程建议准备完整的执行链路说明包括连接器、分析器、优化器、执行器等组件协作流程。