- MySQL 基础
- MySQL - 首页
- MySQL - 简介
- MySQL - 特性
- MySQL - 版本
- MySQL - 变量
- MySQL - 安装
- MySQL - 管理
- MySQL - PHP 语法
- MySQL - Node.js 语法
- MySQL - Java 语法
- MySQL - Python 语法
- MySQL - 连接
- MySQL - Workbench
- MySQL 数据库
- MySQL - 创建数据库
- MySQL - 删除数据库
- MySQL - 选择数据库
- MySQL - 显示数据库
- MySQL - 复制数据库
- MySQL - 数据库导出
- MySQL - 数据库导入
- MySQL - 数据库信息
- MySQL 用户
- MySQL - 创建用户
- MySQL - 删除用户
- MySQL - 显示用户
- MySQL - 修改密码
- MySQL - 授予权限
- MySQL - 显示权限
- MySQL - 收回权限
- MySQL - 锁定用户账户
- MySQL - 解锁用户账户
- MySQL 表
- MySQL - 创建表
- MySQL - 显示表
- MySQL - 修改表
- MySQL - 重命名表
- MySQL - 克隆表
- MySQL - 截断表
- MySQL - 临时表
- MySQL - 修复表
- MySQL - 描述表
- MySQL - 添加/删除列
- MySQL - 显示列
- MySQL - 重命名列
- MySQL - 表锁定
- MySQL - 删除表
- MySQL - 派生表
- MySQL 查询
- MySQL - 查询
- MySQL - 约束
- MySQL - 插入查询
- MySQL - 选择查询
- MySQL - 更新查询
- MySQL - 删除查询
- MySQL - 替换查询
- MySQL - 插入忽略
- MySQL - 插入重复键更新
- MySQL - 插入到选择
- MySQL 运算符和子句
- MySQL - WHERE 子句
- MySQL - LIMIT 子句
- MySQL - DISTINCT 子句
- MySQL - ORDER BY 子句
- MySQL - GROUP BY 子句
- MySQL - HAVING 子句
- MySQL - AND 运算符
- MySQL - OR 运算符
- MySQL - LIKE 运算符
- MySQL - IN 运算符
- MySQL - ANY 运算符
- MySQL - EXISTS 运算符
- MySQL - NOT 运算符
- MySQL - 不等于运算符
- MySQL - IS NULL 运算符
- MySQL - IS NOT NULL 运算符
- MySQL - BETWEEN 运算符
- MySQL - UNION 运算符
- MySQL - UNION 与 UNION ALL
- MySQL - MINUS 运算符
- MySQL - INTERSECT 运算符
- MySQL - INTERVAL 运算符
- MySQL 连接
- MySQL - 使用连接
- MySQL - INNER JOIN
- MySQL - LEFT JOIN
- MySQL - RIGHT JOIN
- MySQL - CROSS JOIN
- MySQL - FULL JOIN
- MySQL - 自连接
- MySQL - 删除连接
- MySQL - 更新连接
- MySQL - UNION 与 JOIN
- MySQL 触发器
- MySQL - 触发器
- MySQL - 创建触发器
- MySQL - 显示触发器
- MySQL - 删除触发器
- MySQL - 插入前触发器
- MySQL - 插入后触发器
- MySQL - 更新前触发器
- MySQL - 更新后触发器
- MySQL - 删除前触发器
- MySQL - 删除后触发器
- MySQL 数据类型
- MySQL - 数据类型
- MySQL - VARCHAR
- MySQL - BOOLEAN
- MySQL - ENUM
- MySQL - DECIMAL
- MySQL - INT
- MySQL - FLOAT
- MySQL - BIT
- MySQL - TINYINT
- MySQL - BLOB
- MySQL - SET
- MySQL 正则表达式
- MySQL - 正则表达式
- MySQL - RLIKE 运算符
- MySQL - NOT LIKE 运算符
- MySQL - NOT REGEXP 运算符
- MySQL - regexp_instr() 函数
- MySQL - regexp_like() 函数
- MySQL - regexp_replace() 函数
- MySQL - regexp_substr() 函数
- MySQL 函数和运算符
- MySQL - 日期和时间函数
- MySQL - 算术运算符
- MySQL - 数值函数
- MySQL - 字符串函数
- MySQL - 聚合函数
- MySQL 杂项概念
- MySQL - NULL 值
- MySQL - 事务
- MySQL - 使用序列
- MySQL - 处理重复项
- MySQL - SQL 注入
- MySQL - 子查询
- MySQL - 注释
- MySQL - 检查约束
- MySQL - 存储引擎
- MySQL - 将表导出到 CSV 文件
- MySQL - 将 CSV 文件导入到数据库
- MySQL - UUID
- MySQL - 公共表表达式
- MySQL - ON DELETE CASCADE
- MySQL - Upsert
- MySQL - 水平分区
- MySQL - 垂直分区
- MySQL - 游标
- MySQL - 存储函数
- MySQL - 信号
- MySQL - 重新发送信号
- MySQL - 字符集
- MySQL - 校对
- MySQL - 通配符
- MySQL - 别名
- MySQL - ROLLUP
- MySQL - 当天日期
- MySQL - 字面量
- MySQL - 存储过程
- MySQL - EXPLAIN
- MySQL - JSON
- MySQL - 标准差
- MySQL - 查找重复记录
- MySQL - 删除重复记录
- MySQL - 选择随机记录
- MySQL - 显示进程列表
- MySQL - 更改列类型
- MySQL - 重置自动递增
- MySQL - Coalesce() 函数
- MySQL 有用资源
- MySQL - 有用函数
- MySQL - 语句参考
- MySQL - 快速指南
- MySQL - 有用资源
- MySQL - 讨论
MySQL - 垂直分区
MySQL 的**分区**用于将大型表划分为存储在不同物理位置的较小分区,并将其视为单独的表。即使这些较小的分区是单独管理的,它们仍然是主表的一部分。
MySQL 中有两种分区形式:**水平分区**和**垂直分区**。
MySQL 垂直分区
MySQL 的**垂直分区**根据列而不是行将表划分为多个表。
MySQL 中有两种主要的垂直分区类型,每种类型都用于特定的目的:
- 范围列分区
- 列表列分区
范围列分区和列表列分区都支持各种数据类型,包括整数类型(TINYINT、SMALLINT、MEDIUMINT、INT 和 BIGINT)、字符串类型(CHAR、VARCHAR、BINARY 和 VARBINARY),以及 DATE 和 DATETIME 数据类型。
范围列分区
MySQL 范围列分区使用一个或多个列作为分区键,根据定义的列值范围将数据划分为分区。
这些列中的值与预定义的范围进行比较,并且每行都分配到包含其列值的范围的分区。
示例
在以下查询中,我们创建一个名为**INVENTORY**的表,并根据“product_quantity”和“product_price”列将其划分为三个分区。具有这些列中特定值的行存储在其相应的分区中:
CREATE TABLE INVENTORY ( id INT, product_name VARCHAR(50), product_quantity INT, product_price int ) PARTITION BY RANGE COLUMNS(product_quantity, product_price) ( PARTITION P_low_stock VALUES LESS THAN (10, 100), PARTITION P_medium_stock VALUES LESS THAN (50, 500), PARTITION P_high_stock VALUES LESS THAN (200, 1200) );
在这里,我们将行插入到上面创建的表中:
INSERT INTO INVENTORY VALUES (1, 'Headphones', 5, 50), (2, 'Mouse', 15, 200), (3, 'Monitor', 30, 300), (4, 'Keyboard', 60, 600), (5, 'CPU', 100, 1000);
以下是获得的**INVENTORY**表:
id | product_name | product_quantity | product_price |
---|---|---|---|
1 | 耳机 | 5 | 50 |
2 | 鼠标 | 15 | 200 |
3 | 显示器 | 30 | 300 |
4 | 键盘 | 60 | 600 |
5 | CPU | 100 | 1000 |
现在,我们在 INVENTORY 表中有一些数据,我们可以使用以下查询显示分区状态以查看数据如何在分区之间分布:
SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='inventory';
您将在下面的输出中看到,各个列根据定义的范围值分配到它们各自的分区:
PARTITION_NAME | TABLE_ROWS |
---|---|
P_high_stock | 2 |
P_low_stock | 1 |
P_medium_stock | 2 |
显示分区:
我们还可以使用 PARTITION 子句显示来自特定分区的数据。例如,要检索来自分区 P_high_stock 的数据,我们使用以下查询:
SELECT * FROM inventory PARTITION (P_high_stock);
它将显示分区 P_high_stock 中的所有记录:
ID | NAME | AGE | ADDRESS | SALARY |
---|---|---|---|---|
4 | 键盘 | 60 | 600 | |
5 | CPU | 100 | 1000 |
同样,我们可以使用相同的语法显示其他分区。
列表列分区
MySQL 列表列分区使用一个或多个列作为分区键,并根据这些列中的特定值将记录分配到分区。当您希望根据离散值或类别将数据分组到分区时,此方法非常方便。
示例
让我们创建一个名为“EMPLOYEES”的表,并使用基于“department”列的列表列分区对其进行分区:
CREATE TABLE EMPLOYEES ( id INT, first_name VARCHAR(50), last_name VARCHAR(50), hiring_date DATE, department VARCHAR(50) ) PARTITION BY LIST COLUMNS(department) ( PARTITION p_sales VALUES IN ('Sales', 'Marketing'), PARTITION p_engineering VALUES IN ('Engineering', 'Research'), PARTITION p_operations VALUES IN ('Operations') );
在这里,我们将记录插入到上面创建的表中:
INSERT INTO EMPLOYEES VALUES (1, 'John', 'Doe', '2020-01-01', 'Sales'), (2, 'Jane', 'Doe', '2020-02-01', 'Marketing'), (3, 'Bob', 'Smith', '2020-03-01', 'Engineering'), (4, 'Alice', 'Johnson', '2020-04-01', 'Research'), (5, 'Mike', 'Brown', '2020-05-01', 'Operations');
以下是获得的 EMPLOYEES 表:
id | first_name | last_name | hiring_date | department |
---|---|---|---|---|
1 | John | Doe | 2020-01-01 | 销售部 |
2 | Jane | Doe | 2020-02-01 | 市场部 |
3 | Bob | Smith | 2020-03-01 | 工程部 |
4 | Alice | Johnson | 2020-04-01 | 研发部 |
5 | Mike | Brown | 2020-05-01 | 运营部 |
我们可以使用以下查询显示 EMPLOYEES 表的分区状态以查看数据如何在分区之间分布:
SELECT PARTITION_NAME, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='EMPLOYEES';
它将显示分区以及根据部门值在每个分区中的行数:
PARTITION_NAME | TABLE_ROWS |
---|---|
p_engineering | 2 |
p_operations | 1 |
p_sales | 2 |