学会了mariadb的partition 将一个大表拆成小的表做实际存储 而上层查询感知不到
1. 怎么创建分区:在navicat创建表之后选项 分区 可以创建 但更建议直接把需求丢给AI去生成 例如按月做分区:
2. 如何查看分区统计信息:
3. 如何合并分区:例如把1月和2月的合并在一起
4. 如何拆分分区:例如把12月拆分成按周进一步分区:
reorganize能保证数据不丢失,如果新分区的范围有任何缺失、重叠(对于 RANGE 分区)或遗漏,执行语句时会立即失败。
这个拆分本质上是一次optimize 把所有数据重新按顺序写入新的分区ibd文件,磁盘占用也会减少
5. 子分区必须对所有分区都应用,所以优先考虑怎么进一步拆分已有的分区
1. 怎么创建分区:在navicat创建表之后选项 分区 可以创建 但更建议直接把需求丢给AI去生成 例如按月做分区:
PARTITION BY RANGE (blocktime)
(PARTITION p_2025_01 VALUES LESS THAN (1738368000) ENGINE = InnoDB,
PARTITION p_2025_02 VALUES LESS THAN (1740787200) ENGINE = InnoDB,
PARTITION p_future VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
2. 如何查看分区统计信息:
SELECT
PARTITION_NAME, -- 分区名称 (例如 p_2025_01)
PARTITION_METHOD, -- 分区类型 (例如 RANGE)
TABLE_ROWS, -- 该分区内的估算行数
DATA_LENGTH, -- 数据长度 (字节)
INDEX_LENGTH, -- 索引长度 (字节)
CREATE_TIME, -- 创建时间
UPDATE_TIME -- 最后更新时间
FROM
INFORMATION_SCHEMA.PARTITIONS WHERE
TABLE_NAME = 'tablename';
3. 如何合并分区:例如把1月和2月的合并在一起
ALTER TABLE tablename
REORGANIZE PARTITION
p_2025_01,
p_2025_02
INTO (
PARTITION p_2025_02 VALUES LESS THAN (1740787200)
);
4. 如何拆分分区:例如把12月拆分成按周进一步分区:
reorganize能保证数据不丢失,如果新分区的范围有任何缺失、重叠(对于 RANGE 分区)或遗漏,执行语句时会立即失败。
ALTER TABLE tablename
REORGANIZE PARTITION p_2025_12 INTO (
PARTITION p_2025_12_w1 VALUES LESS THAN (1765152000),
PARTITION p_2025_12_w2 VALUES LESS THAN (1765756800),
PARTITION p_2025_12_w3 VALUES LESS THAN (1766361600),
PARTITION p_2025_12_w4 VALUES LESS THAN (1766966400),
PARTITION p_2025_12_rem VALUES LESS THAN (1767225600)
);
这个拆分本质上是一次optimize 把所有数据重新按顺序写入新的分区ibd文件,磁盘占用也会减少
5. 子分区必须对所有分区都应用,所以优先考虑怎么进一步拆分已有的分区