Skip to main content

学会了mariadb的partition 将一个大表拆成小的表做实际存储 而上层查询感知不到1. 怎么创建分区:在navicat创建表之后选项 分区 可以创建 但更建议直接把需求丢给AI去生成 例如按月做分区:

  1. 学会了mariadb的partition 将一个大表拆成小的表做实际存储 而上层查询感知不到
    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. 子分区必须对所有分区都应用,所以优先考虑怎么进一步拆分已有的分区