主题
面试速答(先看这里)
**一句话结论:**我们知道,当MySQL中的单表数据量很大以后,一般就要考虑做分库分表了,主要原因就是单表量太大会导致查询效率下降。
60秒标准回答:
我们知道,当MySQL中的单表数据量很大以后,一般就要考虑做分库分表了,主要原因就是单表量太大会导致查询效率下降
但是,因为分库分表其实不仅实现方案复杂,并且也会带来很多问题,比如跨库事务、分页查询等, 不到万不得已,不建议大家直接做分库分表
在分库分表前应该先考虑其他的方案。以及分表的必要性
**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点
回答主线:
- **要点1:**但是,因为分库分表其实不仅实现方案复杂,并且也会带来很多问题,比如跨库事务、分页查询等, 不到万不得已,不建议大家直接做分库分表。
- **要点2:**比如说,2000万的数据量,其实大多数情况下用好索引就可以提升很大的效率的,有的时候把索引优化好,表结构设计好(比如适当做数据冗余),SQL语句(比如减少多表JOIN)优化好,就可以大大提升性能。
- **要点3:**减少对数据库的压力可以通过缓存来实现,不要把所有的流量都交给数据库来抗。
- **要点4:**通过数据分区可以减小单个表的物理存储空间,数据分区后,存储在不同的表或文件中,以减小单表的数据量,可以提高查询性能。
- **要点5:**另外,也可以考虑采用分布式数据库系统,这样可以在多个节点上分散数据,提高性能和容量。
**记忆锚点:**大多数情况下用好索引 → 当的在近端做一些缓存 → 5分布式数据库 → 1数据库优化 → 比如跨库事务 → 4数据归档
关键取舍:
- 那么,当数据量大的时候,也可以用其他的方案来解决,应该优先考虑以下几个方案: 比如说,2000万的数据量,其实大多数情况下用好索引就可以提升很大的效率的,有的时候把索引优化好,表结构设计好(比如适当做数据冗余),SQL语句(比如减少多表JOIN)优化好,就可以大大提升性能。
- 通过数据分区可以减小单个表的物理存储空间,数据分区后,存储在不同的表或文件中,以减小单表的数据量,可以提高查询性能。
- 5、分布式数据库 另外,也可以考虑采用分布式数据库系统,这样可以在多个节点上分散数据,提高性能和容量。
易错提醒:
- 但是,因为分库分表其实不仅实现方案复杂,并且也会带来很多问题,比如跨库事务、分页查询等, 不到万不得已,不建议大家直接做分库分表。
- 减少对数据库的压力可以通过缓存来实现,不要把所有的流量都交给数据库来抗。
追问准备:
- 围绕「大多数情况下用好索引」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「当的在近端做一些缓存」:底层原理是什么?使用时有哪些边界和常见坑?
- 围绕「5分布式数据库」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
打开文档:✅从B+树的角度分析为什么单表2000万要考虑分表??
我们知道,当MySQL中的单表数据量很大以后,一般就要考虑做分库分表了,主要原因就是单表量太大会导致查询效率下降。
但是,因为分库分表其实不仅实现方案复杂,并且也会带来很多问题,比如跨库事务、分页查询等,不到万不得已,不建议大家直接做分库分表。
在分库分表前应该先考虑其他的方案。以及分表的必要性。
一般来说,我们做分库的目的是提升数据库的吞吐量,做分表的目的是提升查询的效率。那么,当数据量大的时候,也可以用其他的方案来解决,应该优先考虑以下几个方案:
1、数据库优化
比如说,2000万的数据量,其实大多数情况下用好索引就可以提升很大的效率的,有的时候把索引优化好,表结构设计好(比如适当做数据冗余),SQL语句(比如减少多表JOIN)优化好,就可以大大提升性能。
2、缓存
减少对数据库的压力可以通过缓存来实现,不要把所有的流量都交给数据库来抗。适当的在近端做一些缓存,如本地缓存、分布式缓存等就可以快速的返回,还能减少数据库的压力。
3、分区
通过数据分区可以减小单个表的物理存储空间,数据分区后,存储在不同的表或文件中,以减小单表的数据量,可以提高查询性能。
4、数据归档
我们可以定期的清理一些不再需要,或者不再活跃的数据,把他们进行数据归档到辅助存储中(如历史表,离线数仓等),这样就可以减少数据的数量,就能大大提升效率。
5、分布式数据库
另外,也可以考虑采用分布式数据库系统,这样可以在多个节点上分散数据,提高性能和容量。虽然分布式数据库需要的成本比较高,但是相比分库分表的改造来说,受益也比较大。