垂直分表
概念:将一个表按照字段进行拆分,把经常一起使用的字段放在一个表中,不常用的字段或者大字段(如文本、图片链接等)放到另一个表中。这些表拥有相同的主键,通过主键关联数据。 使用场景:当一个表的字段过多,导致表结构变得复杂,且部分字段使用频率差异较大时,可采用垂直分表。 示例:假设存在一个用户信息表user_info,包含用户的基本信息(如user_id、username、password)和一些不常用的扩展信息(如bio、hobby),可以将其拆分为user_basic_info和user_extra_info两个表。
CREATE TABLE user_info ( user_id INT PRIMARY KEY , username VARCHAR ( 50 ) , password VARCHAR ( 50 ) , bio TEXT , hobby VARCHAR ( 100 )
) ;
CREATE TABLE user_basic_info ( user_id INT PRIMARY KEY , username VARCHAR ( 50 ) , password VARCHAR ( 50 )
) ;
CREATE TABLE user_extra_info ( user_id INT PRIMARY KEY , bio TEXT , hobby VARCHAR ( 100 )
) ;
垂直分库
概念:根据业务功能,将不同业务模块所使用的表拆分到不同的数据库 中。每个数据库 可以部署在不同的服务器上,实现数据库 层面的分离。 使用场景:当应用系统的业务越来越复杂,不同业务模块的数据之间独立性较强,且对资源的需求不同时,适合采用垂直分库。 示例:一个电商系统,可将商品相关的表存于product_db数据库 ,订单相关的表存于order_db数据库 。
CREATE DATABASE product_db;
CREATE TABLE product_db. product ( product_id INT PRIMARY KEY , product_name VARCHAR ( 100 ) , price DECIMAL ( 10 , 2 )
) ;
CREATE DATABASE order_db;
CREATE TABLE order_db. orders ( order_id INT PRIMARY KEY , user_id INT , product_id INT , order_date TIMESTAMP
) ;
水平分表
概念:将一个表的数据按照一定的规则(如按时间、按 ID 范围等)拆分成多个结构相同的子表。每个子表的数据是原表数据的一部分,所有子表的数据合起来就是原表的数据。 使用场景:当一个表的数据量过大,导致查询、插入、更新等操作变慢时,可采用水平分表。 示例:假设存在一个订单表orders,数据量非常大,可以按照订单日期将其拆分为多个子表,如orders_2024、orders_2025等。
CREATE TABLE orders ( order_id INT PRIMARY KEY , order_date DATE , amount DECIMAL ( 10 , 2 )
) ;
CREATE TABLE orders_2024 ( order_id INT PRIMARY KEY , order_date DATE , amount DECIMAL ( 10 , 2 )
) ;
CREATE TABLE orders_2025 ( order_id INT PRIMARY KEY , order_date DATE , amount DECIMAL ( 10 , 2 )
) ;
水平分库
概念:把一个表的数据按照一定规则(如按哈希值、按地域等)拆分到不同的数据库 中,这些数据库 的表结构相同。每个数据库 可以部署在不同的服务器上,从而分散数据库 的负载。 使用场景:当单个数据库 无法承载大量数据和高并发访问时,可采用水平分库。 示例:假设有一个用户表users,数据量巨大,可以按照用户 ID 的哈希值将其数据拆分到两个数据库 user_db_1和user_db_2中。
CREATE DATABASE user_db_1;
CREATE TABLE user_db_1. users ( user_id INT PRIMARY KEY , username VARCHAR ( 50 ) , email VARCHAR ( 100 )
) ;
CREATE DATABASE user_db_2;
CREATE TABLE user_db_2. users ( user_id INT PRIMARY KEY , username VARCHAR ( 50 ) , email VARCHAR ( 100 )
) ;