2021-09-15 12:07:45
数据库瓶颈主要体现在IO瓶颈和CPU瓶颈,最终会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。
IO瓶颈:
磁盘读IO瓶颈:热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度。解决方案是分库和垂直分表。
网络IO瓶颈:请求的数据太多,网络带宽不够。解决方案是分库。
CPU瓶颈:
SQL问题:如SQL中包含join,group by,order by,非索引字段条件查询等,增加CPU运算的操作。解决方案是SQL优化,建立合适的索引,在业务Service层进行业务计算。
单表数据量太大:查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈。解决方案是水平分表。

每个库的结构都一样。
每个库的数据都不一样,没有交集。
所有库的并集是全量数据。
每个表的结构都一样。
每个表的数据都不一样,没有交集。
所有表的并集是全量数据。

每个库的结构都不一样。
每个库的数据也不一样,没有交集。
所有库的并集是全量数据。

每个表的结构都不一样。
每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据。
所有表的并集是全量数据。
基于水平分库分表,拆分策略为常用的hash法。
端上除了partition key只有一个非partition key作为条件查询:
映射法:

基因法:

注:写入时,基因法生成user_id。关于xbit基因,例如要分8张表,23=8,故x取3,即3bit基因。根据user_id查询时可直接取模路由到对应的分库或分表。根据user_name查询时,先通过user_name_code生成函数生成user_name_code再对其取模路由到对应的分库或分表。id生成常用snowflake算法。
端上除了partition key不止一个非partition key作为条件查询:
映射法:

冗余法:

注:按照order_id或buyer_id查询时路由到db_o_buyer库中,按照seller_id查询时路由到db_o_seller库中。
后台除了partition key还有各种非partition key组合条件查询:
NoSQL法:

冗余法:

基于水平分库分表,拆分策略为常用的hash法。
基于水平分库分表,拆分策略为常用的hash法。

注:扩容是成倍的。
水平扩容表(双写迁移法):

示例GitHub地址: