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

news/2025/1/24 16:43:13/

垂直分表

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

相关文章

深入MapReduce——计算模型设计

引入 通过引入篇,我们可以总结,MapReduce针对海量数据计算核心痛点的解法如下: 统一编程模型,降低用户使用门槛分而治之,利用了并行处理提高计算效率移动计算,减少硬件瓶颈的限制 优秀的设计&#xff0c…

mybatis(57/134)

今天没什么想法,搭了个转账平台,加深了点之前javaweb的mvc架构的印象,还有异常的抛出处理等

一键视频转文字/音频转文字,浏览器右键提取B站视频文案,不限时长免费无限次可用

上篇文章阿虚分享了自己的「短视频」笔记方案 短视频文件小,易存储,所以阿虚建议是直接将原视频插入到笔记当中 而长视频文件大,很难像短视频一样操作。阿虚之前的建议是提取重要部分视频转长截图,或者视频转GIF 但上述方案仔细…

PHP异步非阻塞MySQL客户端连接池

文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…

【Unity3D】Unity混淆工具Obfuscator使用

目录 一、导入工具 二、各种混淆形式介绍 2.1 程序集混淆 2.2 命名空间混淆 2.3 类混淆 2.4 函数混淆 2.5 参数混淆 2.6 字段混淆 2.7 属性混淆 2.8 事件混淆 三、安全混淆 四、兼容性处理 4.1 动画方法兼容 4.2 GUI方法兼容 4.3 协程方法兼容 五、选项 5.1 调…

Linux终端之旅: 权限管理三剑客与特殊权限

Linux 权限的概念 Linux 下有两种用户:超级用户( root )、普通用户。 超级用户:可以在linux下做任何事,不受-rwx权限的影响 普通用户:linux使用者,受权限的影响 超级用户的命令提示符是“#”&…

DAY10,数据类型

题目 请写出以下几个数据的类型 整数 a int a的地址 int* 存放a的数组b int [?] ?由数组b大小决定 存放a的地址的数组c …

计算机毕业设计Python+卷积神经网络租房推荐系统 租房大屏可视化 租房爬虫 hadoop spark 58同城租房爬虫 房源推荐系统

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…