当前位置: 首页 > article >正文

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

垂直分表

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

http://www.kler.cn/a/517369.html

相关文章:

  • 【华为OD-E卷 - 计算网络信号 100分(python、java、c++、js、c)】
  • 「 机器人 」扑翼飞行器控制方法浅谈
  • Go的垃圾回收(GC)机制
  • 如何在 Spring Boot 中实现自定义属性
  • 计算机视觉算法实战——驾驶员安全带检测
  • 2022年全国职业院校技能大赛网络系统管理赛项模块A:网络构建(样题8)
  • 深入理解 HTML DOM:文档对象模型详解
  • windows系统改变vscode的插件位置
  • 【Bug 记录】el-sub-menu 第一次进入默认不高亮
  • 【17】组织测试(一)
  • 组件封装-List
  • kettle与Springboot的集成方法,完整支持大数据组件
  • PySide(PyQT)进行SQLite数据库编辑和前端展示的基本操作
  • 使用 Git LFS 管理大文件基本简介
  • Java开发的商城系统怎样
  • Consul持久化配置报错1067---consul_start
  • ansible自动化运维实战--fetch、cron和group模块(5)
  • 【Uniapp-Vue3】uni-icons的安装和使用
  • 使用Mermaid和AI画流程图
  • vue2和vue3指令