MYSQL分区索引

MYSQL中,数据量大的情况下,可以增加索引加快检索速度。但是数据量特别大的情况下,只能分库分表,但是在分库分表后数据量依然很大,已经做不了分表的情况下,索引依旧查询不动的情况下,可以使用分区来解决。
从MySQL5.1开始MySQL支持的绝大部分引擎都开启了表分区功能。

分区VS分库分表

image.png

基本概念

表分区是 MySQL 提供的一种物理数据组织技术,它将逻辑上的单个表拆分为多个物理存储单元,但对应用程序来说仍然是一个单一的表。分区后的表数据会按照指定的规则分布在不同的存储位置(如不同的文件或磁盘),但不需要修改 SQL 查询语句,数据库会自动定位数据所在的分区。

适用场景

1、按时间范围查询频繁;
2、历史数据归档需求,不需要的数据可以直接删除分区,不需要逐行删除数据;
3、单表数据超过 10GB 或 1 亿行,此时全表扫描耗时显著,分区可将数据分散到多个物理设备。

创建分区例子

1、按时间范围分区;

CREATE TABLE orders (
    id INT,
    order_no VARCHAR(50),
    end_time DATETIME NOT NULL,
    PRIMARY KEY (id, end_time)
)
PARTITION BY RANGE (to_days(`end_time`)) (
    PARTITION p20241220 VALUES LESS THAN (739605) ENGINE = InnoDB,
    PARTITION p20241227 VALUES LESS THAN (739612) ENGINE = InnoDB
);

2、按照地域分区;

CREATE TABLE users (
    id INT,
    name VARCHAR(50),
    region_id TINYINT NOT NULL,
    PRIMARY KEY (id, region_id)   
)
PARTITION BY LIST (region_id) (
    PARTITION p_north VALUES IN (1, 2, 3),   
    PARTITION p_south VALUES IN (4, 5, 6)
);

3、按照HASH 分区(按哈希值);

CREATE TABLE logs (
    id INT,
    user_id INT NOT NULL,
    action VARCHAR(50),
    PRIMARY KEY (id, user_id)  
)
PARTITION BY HASH (user_id)
PARTITIONS 8;  -- 自动创建 p0~p7 共 8 个分区

注意事项

1、分区键必须包含在主键中(MySQL 强制要求);
2、RANGE/LIST 分区中,NULL 值会被分到第一个分区(VALUES LESS THAN 最小的分区);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容