彻底搞清mysql分库分表(垂直分库,垂直分表,水平分库,水平分表)
1. 垂直分库(Vertical Sharding)
定义: 垂直分库是指将不同的表或表的一部分分配到不同的数据库实例中。每个数据库实例只包含部分表,从而分散了数据和负载。
应用场景:
-
功能模块分离:将不同功能模块的数据存储在不同的数据库中。例如,用户信息存储在一个数据库中,订单信息存储在另一个数据库中。
-
性能优化:通过分散数据和负载,减少单个数据库的负载,提高性能。
-
安全性:将敏感数据和非敏感数据分开存储,提高安全性。
示例: 假设有一个电商系统,可以将用户信息表(
users)和订单信息表(orders)分别存储在两个不同的数据库实例中:-
user_db:存储用户信息表(users)。 -
order_db:存储订单信息表(orders)。
2. 垂直分表(Vertical Partitioning)
定义: 垂直分表是指将一个表的列分成多个表,每个表只包含部分列。这样可以减少单个表的宽度,提高查询性能。
应用场景:
-
减少表宽度:当一个表包含大量列时,查询时可能只需要部分列,通过垂直分表可以减少表的宽度,提高查询性能。
-
提高索引效率:通过将高频查询的列和低频查询的列分开,可以提高索引的效率。
示例: 假设有一个用户信息表(
users),包含以下列:-
user_id -
username -
email -
address -
phone -
created_at -
updated_at
可以将这个表垂直分成两个表:
-
users_basic:存储user_id、username、email。 -
users_detail:存储user_id、address、phone、created_at、updated_at。
3. 水平分库(Horizontal Sharding)
定义: 水平分库是指将表的数据行分配到不同的数据库实例中。每个数据库实例包含表的一部分行,从而分散了数据和负载。
应用场景:
-
数据量大:当单个数据库实例无法处理大量数据时,可以将数据分散到多个数据库实例中。
-
高并发:通过分散数据和负载,提高系统的并发处理能力。
示例: 假设有一个订单信息表(
orders),包含大量订单数据。可以将订单数据按用户ID的哈希值分配到不同的数据库实例中:-
order_db_1:存储用户ID哈希值为0-9999的订单。 -
order_db_2:存储用户ID哈希值为10000-19999的订单。 -
以此类推。
4. 水平分表(Horizontal Partitioning)
定义: 水平分表是指将表的数据行分成多个表,每个表只包含部分行。这样可以减少单个表的数据量,提高查询性能。
应用场景:
-
数据量大:当单个表的数据量过大时,查询性能会下降,通过水平分表可以减少单个表的数据量。
-
时间序列数据:对于时间序列数据,可以按时间范围分表,例如按年、按月分表。
示例: 假设有一个订单信息表(
orders),包含大量订单数据。可以将订单数据按时间范围分成多个表:-
orders_2023:存储2023年的订单。 -
orders_2024:存储2024年的订单。 -
以此类推。
总结
-
垂直分库:按功能模块或数据类型将表分配到不同的数据库实例中。
-
垂直分表:将一个表的列分成多个表,减少表的宽度。
-
水平分库:按数据行将表的数据分配到不同的数据库实例中。
-
水平分表:将一个表的数据行分成多个表,减少单个表的数据量。
相关连接:
https://zhuanlan.zhihu.com/p/98392844 ...............................搞清mysql分库分表(垂直分库,垂直分表,水平分库,水平分表)
浙公网安备 33010602011771号