数据库分库分表
感觉这个也是面试的时候很容易被问到的问题。分库分表,其实就是将原本存在同一台服务器上的数据库拆分到不同的服务器上。以达到扩充系统性能的目的。
对于数据拆分的思路:
- 结构化的数据:分库分表
- 异构数据,复杂查询的高并发架构方案:NoSQL存储(Elasticsearch,clickHouse这种)。
什么场景下要进行分库分表
首先可以对数据库进行压测,用来测试吞吐量和并发量。此外,比较通用的数据是:
- 单表记录参考上限是 500w-1000w (感觉这个数据有点小了,应该还能更大些)
- 单库的TPS上限:1000-1500TPS
TPS/QPS
- QPS:每秒处理的查询数(相当于数据库的查询)
- TPS:每秒处理的事务数(相当于数据库的写入和修改)
性能瓶颈
常见的数据库瓶颈有IO瓶颈、CPU瓶颈,IO瓶颈又分为磁盘读IO和磁盘写IO
- 磁盘读IO瓶颈:因为热点数据较多,导致数据库缓存存放不下,这时候查询就会有大量的磁盘IO,查询速度会比较慢。同时会产生大量的活跃的连接,最终会导致无可用连接的问题
- 磁盘写IO瓶颈:这个不难想到,因为频繁写入,并且磁盘的写入速度低,会产生大量的活动的连接,最终导致无可用连接。
- CPU瓶颈:一般就是CPU占用率一直很高。
- 慢SQL问题:join,group by ,非索引查询。可以对SQL进行优化或者将计算量大的SQL逻辑放到应用中处理。
- 单表数据量大,也会导致查询时扫描太多行,占用较多CPU。
出现IO,CPU瓶颈的时候,可以先从代码,SQL,索引几个方面进行优化,如果这几个方面没有太多优化的余地,就可以考虑分库分表了
分库:将一个数据库分为多个数据库,用于提高TPS/QPS(因为单库的TPS有上限的)
分表:将一个表的数据放到多个表中。
水平拆分&&垂直拆分
水平拆分:
水平拆分就是拆分数据,不拆分结构。水平拆分把一个表的数据,拆分到多个库的多个表中,每个库的表结构都相同。所有库表加起来就是全部数据。
水平拆分的意义就是将数据均匀地存放在更多的库中,然后用多个库来扛更高的并发,另外就是用多个库的存储容量来扩容。
水平拆分的原则:
- 让每个表中的数据记录的数据控制在一定范围内,保证SQL的性能。
- SQL越复杂,单表数据记录数越少。
一般的预估:如果TPS是5000 ,并且单库的TPS是1000-1500,那么就需要拆分成4个库。
垂直拆分
垂直拆分就是既拆结构,也拆数据。垂直拆分就是把一个有很多字段的表从结构上拆分成多个表或者多个库,每个库表的结构都不一样。每个库表包含部分字段。
垂直拆分的原则:将较少的访问频率高的字段放在一个表里,将较多的并且访问频率很低的放在另一个表。因为查询的数据是有缓存的,访问频率高的字段数量越少,就可以在缓存中存放更多的数据,性能就越好。所以,垂直拆分的出发点就是充分利用数据库的缓存,提升性能。