Mysql面试题----什么是垂直分表、垂直分库、水平分库、水平分表

发布于:2025-02-10 ⋅ 阅读:(56) ⋅ 点赞:(0)

垂直分表

  • 概念:将一个表按照字段进行拆分,把经常一起使用的字段放在一个表中,不常用的字段或者大字段(如文本、图片链接等)放到另一个表中。这些表拥有相同的主键,通过主键关联数据。
  • 使用场景:当一个表的字段过多,导致表结构变得复杂,且部分字段使用频率差异较大时,可采用垂直分表。
  • 示例:假设存在一个用户信息表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)
);

-- 水平分表后的2024年订单表
CREATE TABLE orders_2024 (
    order_id INT PRIMARY KEY,
    order_date DATE,
    amount DECIMAL(10, 2)
);

-- 水平分表后的2025年订单表
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)
);

网站公告

今日签到

点亮在社区的每一天
去签到