1、什么是 MySQL 表分区?
MySQL 的表分区功能允许将一个大表划分为多个较小的子表(称为分区),每个分区可以独立存储在不同的物理位置。常见的分区方式包括:
范围分区:根据某个字段的值范围进行分区。
列表分区:根据某个字段的离散值进行分区。
哈希分区:根据某个字段的哈希值进行分区。
键分区:与哈希分区类似,但支持多列。
2、蜘蛛池场景下的需求分析
假设你的蜘蛛池(Spider Pool)表结构如下:
sql
CREATE TABLE spider_pool (
id INT AUTO_INCREMENT PRIMARY KEY,
url VARCHAR(255) NOT NULL,
status ENUM('pending', 'active', 'completed') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
创建分区表
sql
CREATE TABLE spider_pool (
id INT AUTO_INCREMENT PRIMARY KEY,
url VARCHAR(255) NOT NULL,
status ENUM('pending', 'active', 'completed') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE (YEAR(created_at)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p_max VALUES LESS THAN MAXVALUE
);
查询分区信息
你可以通过以下命令查看当前表的分区信息:
sql
SHOW CREATE TABLE spider_pool;
4、使用列表分区
如果你希望根据 `status` 字段对表进行分区,可以使用列表分区。例如:
sql
CREATE TABLE spider_pool (
id INT AUTO_INCREMENT PRIMARY KEY,
url VARCHAR(255) NOT NULL,
status ENUM('pending', 'active', 'completed') DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY LIST (status) (
PARTITION p_pending VALUES IN ('pending'),
PARTITION p_active VALUES IN ('active'),
PARTITION p_completed VALUES IN ('completed')
);