文章目录
一、索引为什么用B+树不用二叉树?(灵魂拷问)
面试官最爱问的索引原理问题!咱们用最形象的栗子说明:假设有100万条数据,二叉树可能长到20层(2^20≈百万级),而B+树通常只要3-4层。想象一下查20楼和查3楼的效率差距!(啪!拍桌子)
重点来了:B+树的叶子节点形成链表,适合范围查询。比如查id>100的数据,找到100的位置后直接向右遍历,比二叉树一个个回溯快N倍!
实战踩坑案例:某次我给create_time字段建了单列索引,但查询WHERE create_time>'2023' AND status=1时还是慢成狗。后来发现没遵循最左前缀原则,改成联合索引(status,create_time)后速度起飞!
二、事务隔离级别怎么选?(实际场景分析)
先背八股文:读未提交→读已提交→可重复读→串行化。但实际开发中,推荐直接用默认的**可重复读(Repeatable Read)**吗?大漏特漏!
血泪教训:在电商系统中,如果用可重复读处理库存扣减,可能遇到幻读导致超卖。这时必须上SELECT…FOR UPDATE加锁,或者改用读已提交+乐观锁版本号控制。
(敲黑板)隔离级别选择口诀:
- 金融交易 → 串行化(安全第一)
- 普通业务 → 读已提交(性能平衡)
- 报表统计 → 可重复读(数据一致)
三、InnoDB和MyISAM的区别(不止于理论)
教科书式的答案:InnoDB支持事务、行锁、外键;MyISAM表锁、全文索引。但实际生产中,这两个存储引擎的差距比想象中更大!
亲身经历:公司有个200GB的MyISAM日志表,某次ALTER TABLE加了整整8小时!改用InnoDB后同样操作只要20分钟。因为InnoDB的在线DDL(ALGORITHM=INPLACE)是真香啊!
存储选择指南:
- 写多读少 → InnoDB(崩溃恢复强)
- 读多写少 → MyISAM(count(*)快)
- 地理空间 → 选MySQL 5.7+的InnoDB(已支持空间索引)
四、死锁了怎么办?(救命指南)
遇到死锁别慌!先上经典复现场景:
- 事务A先更新id=1,再更新id=2
- 事务B先更新id=2,再更新id=1
- 互相等待→死锁达成!
应急处理四步走:
SHOW ENGINE INNODB STATUS查看死锁日志- 分析
LATEST DETECTED DEADLOCK部分 - 优化SQL执行顺序(所有事务按相同顺序操作)
- 降低事务粒度(能不用事务就别用!)
高阶技巧:在代码层做锁排序,比如按id升序加锁。就像停车场规定只允许从东向西开,就不会有对头车堵死的情况了。
五、SQL优化必杀技(20倍性能提升实战)
别再说EXPLAIN了!来看真实优化案例:
原始SQL:
SELECT * FROM orders
WHERE YEAR(create_time)=2023
AND product_name LIKE '%手机%'
问题诊断:
- 对create_time使用函数导致索引失效
- 模糊查询前导通配符使索引失效
优化方案:
SELECT * FROM orders
WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'
AND product_name LIKE '手机%' -- 允许前缀匹配
配合措施:
- 建立联合索引
(create_time, product_name) - 对product_name增加全文索引
- 查询结果从2.3秒→0.1秒,质的飞跃!
六、连接池参数怎么调?(调优秘籍)
常见配置误区:max_connections设的越大越好?错!连接数过高会导致:
- 内存暴涨(每个连接至少8MB)
- CPU调度开销增大
- 线程竞争激烈
黄金配置公式:
最大连接数 = (核心数 * 2) + 有效磁盘数
比如4核CPU+1块SSD,建议max_connections=9
监控命令备忘:
SHOW STATUS LIKE 'Threads_connected'; -- 当前连接数
SHOW VARIABLES LIKE 'wait_timeout'; -- 超时时间(建议300秒)
七、主从复制延迟怎么破?(高可用方案)
遇到"主库写入后从库查不到"的情况?试试这些方案:
- 半同步复制:主库提交事务时至少一个从库确认
- 并行复制:MySQL 5.7+的slave_parallel_type=LOGICAL_CLOCK
- 路由策略:写操作走主库,读操作按业务容忍度选择主/从
某金融项目实战:采用**MGR(MySQL Group Replication)**实现多主架构,数据延迟控制在毫秒级,同时用ProxySQL做智能路由,完美解决读延迟问题。
八、亿级数据分库分表(拆库拆表指南)
单表超过2千万就该考虑拆分了!常用方案对比:
| 方案 | 优点 | 缺点 |
|---|---|---|
| 水平分库 | 彻底解决性能瓶颈 | 跨库查询复杂 |
| 垂直分表 | 业务解耦清晰 | 需要改应用逻辑 |
| 时间分片 | 归档方便 | 热点数据问题 |
某电商平台实战:用户表按uid取模分256库,订单表按月份分表,配合ShardingSphere实现透明化路由。查询性能从15秒降到0.5秒!
九、终极灵魂拷问:为什么用MySQL而不用XXX?
遇到这种开放性问题,记住三点式回答:
- 生态成熟:社区活跃,工具链完善(Percona、XtraBackup等)
- 场景匹配:OLTP场景性能强劲,5.7后支持JSON类型
- 可控成本:相比Oracle省去授权费,比MongoDB事务更强
举个实际例子:我们选择MySQL而不是PostgreSQL,因为团队更熟悉MySQL的运维体系,且需要用到Galera Cluster实现多活架构。
附:高频考点速记表
| 考点 | 必背要点 | 关联问题 |
|---|---|---|
| 索引 | B+树高度、覆盖索引 | 最左前缀原则失效场景 |
| 事务 | ACID、隔离级别 | 幻读 vs 不可重复读 |
| 锁 | 行锁、间隙锁 | 死锁检测与避免 |
| 优化 | 执行计划解读 | 索引下推优化 |
最后送大家一句话:MySQL学得好,offer拿到老!记得动手实操每个知识点,面试时才能游刃有余~
1236

被折叠的 条评论
为什么被折叠?



