解读TaurusDB二级分区,如何提高查询性能和管理效率
摘要:TaurusDB全面兼容MySQL分区表的语法和功能,支持更加丰富的分区方式和组合策略。
1.背景介绍
2. TaurusDB分区表功能介绍
2.1 MySQL分区表原理介绍
l 一级分区
图1 电商系统中的订单表的一级分区示意图
mysql> CREATE TABLE `orders` (
id INT AUTO_INCREMENT,
city_name VARCHAR(50),
PRIMARY KEY (id, city_name)
)
PARTITION BY LIST COLUMNS(city_name) (
PARTITION pShanghai VALUES IN ('上海'),
PARTITION pXian VALUES IN ('西安'),
PARTITION pShenzhen VALUES IN ('深圳')
);
mysql> EXPLAIN SELECT * FROM `orders` WHERE city_name= '上海';
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
|1| SIMPLE | orders | pShanghai | index | PRIMARY | PRIMARY | 206 | NULL | 1 |100.00| Using where; Using index |
+----+-------------+-----------+------------+-------+---------------+---------+---------+------+------+----------+--------------------------+
l 二级分区
mysql> create table `orders` (
order_id bigint NOT NULL COMMENT '订单编号',
city_name varchar(20) NOT NULL COMMENT '所属城市',
purchase_time date NOT NULL COMMENT '下单时间'
) partition by list (year(purchase_time))
subpartition by hash (month(purchase_time))
subpartitions 12 (
partition p_2022 values in (2022),
partition p_2023 values in (2023),
partition p_2024 values in (2024)
);
表1 社区MySQL四种分区的划分方式及适用场景
2.2 TaurusDB二级分区增强
表2 MySQL和TaurusDB支持的分区组合方式
mysql> create table `orders` (
order_id bigint NOT NULL COMMENT '订单编号',
city_name varchar(20) NOT NULL COMMENT '所属城市',
purchase_time date NOT NULL COMMENT '下单时间'
)
partition by list columns (city_name)
subpartition by range (year(purchase_time)) (
partition p_shanghai values in ('上海') (
subpartition shanghai_2022 values less than (2023),
subpartition shanghai_2023 values less than (2024),
subpartition shanghai_2024 values less than (2025)
),
partition p_shenzhen values in ('深圳') (
subpartition shenzhen_2022 values less than (2023),
subpartition shenzhen_2023 values less than (2024),
subpartition shenzhen_2024 values less than (2025)
),
partition p_xian values in ('西安') (
subpartition xian_2022 values less than (2023),
subpartition xian_2023 values less than (2024),
subpartition xian_2024 values less than (2025))
);
图2 电商系统中的订单表的二级分区示意图
2.3 LIST DEFAULT HASH分区表
mysql> CREATE TABLE `orders` (
city_name CHAR(50),
order_time INT
)
PARTITION BY LIST COLUMNS (city_name) (
PARTITION p_jiangsu VALUES IN ('无锡','苏州','南京'),
PARTITION p_shanxi VALUES IN ('西安','宝鸡','榆林'),
PARTITION p_guangdong VALUES IN ('深圳','珠海','东莞'),
PARTITION p_others DEFAULT PARTITIONS 3
);
图3 LIST DEFAULT HASH分区示意图
2.4 INTERVAL RANGE分区表
mysql> CREATE TABLE `sales` (
id BIGINT,
uid BIGINT,
order_time DATETIME
)
PARTITION BY RANGE COLUMNS(order_time) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-1'),
PARTITION P1 VALUES LESS THAN('2021-11-1')
);
INSERT INTO sales VALUES(1, 1010101010, '2021-12-25');
mysql> CREATE TABLE `sales` (
id BIGINT,
uid BIGINT,
order_time DATETIME
)
PARTITION BY RANGE COLUMNS(order_time) INTERVAL(MONTH, 1) (
PARTITION p0 VALUES LESS THAN('2021-10-1'),
PARTITION P1 VALUES LESS THAN('2021-11-1'),
PARTITION _p20211201000000 VALUES LESS THAN ('2021-12-01 00:00:00'),
PARTITION _p20220101000000 VALUES LESS THAN ('2022-01-01 00:00:00')
);
图4 INTERVAL RANGE分区示意图