在 varchar 列上对 mysql 表进行分区

问题描述 投票:0回答:1

我有一个包含 40 亿条记录的 mysql(v8.x) 表,我需要对其中一个 varchar 列进行分区。 在这种情况下,日期列或整数列上的分区不起作用。 这是一个独特的用例。

分区将在 cust_id 列上 cust_id 包含如下数据

| 2184-204CECE8FPNE_01_0102_4 |
| 2184-08NFINO3NC0E_01_0102_4 |
| 2185-B28RNFPE3NCS_01_0102_4 |
| 2185-HP3DNFNF2DNF_01_0102_4 |
| 9732-0I02NCNN30DW_01_0102_4 |
| 9732-8JFN30FJMDP3_01_0102_4 |
| 9732-B02F30CN3D25_01_0102_4 |
| 3184-N33NF4FNPF33_01_0102_4 |
| 3184-0702NDNDJD3S_01_0102_4 |

由于数据中有连字符,我将如何对数据进行分区? 是的,分区将位于第一组数字上(在字符连字符之前 - 仅在第一个连字符之前)

我试图创建一个如下代码片段所示的表格,但失败了:(

感谢所有的帮助,

谢谢你

这是我尝试过的创建语句,它不起作用

CREATE TABLE cust_part (
  id varchar(127) NOT NULL,
  cust_id varchar(127) NOT NULL,
  PRIMARY KEY (id,cust_id),
  KEY idx_cust_id (cust_id)
) 
PARTITION BY RANGE COLUMNS (substring_index(cust_id,'-',1))
(
PARTITION p1000 VALUES LESS THAN ('1000'),
PARTITION p2000 VALUES LESS THAN ('2000'),
PARTITION p3000 VALUES LESS THAN ('3000'),
PARTITION p4000 VALUES LESS THAN ('4000'),
PARTITION p5000 VALUES LESS THAN ('5000'),
PARTITION p6000 VALUES LESS THAN ('6000'),
PARTITION p7000 VALUES LESS THAN ('7000'),
PARTITION p8000 VALUES LESS THAN ('8000'),
PARTITION p9000 VALUES LESS THAN ('9000'),
PARTITION p10000 VALUES LESS THAN ('10000'),
PARTITION pMax VALUES LESS THAN MAXVALUE
);
mysql partitioning range-partitions
1个回答
0
投票

https://dev.mysql.com/doc/refman/8.4/en/partitioning-columns-range.html 说:

  • RANGE COLUMNS
    不接受表达式,仅接受列名称。

所以你不能使用

substring_index()
或任何其他功能。

你不必这样做。您可以依赖排序小于或大于您在分区定义中使用的固定值的字符串。

但是您必须记住,因为该列是 varchar,而不是整数,所以您必须按字母顺序而不是数字顺序对范围进行排序。

以下作品:

CREATE TABLE cust_part (
  id varchar(127) NOT NULL,
  cust_id varchar(127) NOT NULL,
  PRIMARY KEY (id,cust_id),
  KEY idx_cust_id (cust_id)
) 
PARTITION BY RANGE COLUMNS (cust_id)
(
PARTITION p1000 VALUES LESS THAN ('1000-'),
PARTITION p10000 VALUES LESS THAN ('10000-'),
PARTITION p2000 VALUES LESS THAN ('2000-'),
PARTITION p3000 VALUES LESS THAN ('3000-'),
PARTITION p4000 VALUES LESS THAN ('4000-'),
PARTITION p5000 VALUES LESS THAN ('5000-'),
PARTITION p6000 VALUES LESS THAN ('6000-'),
PARTITION p7000 VALUES LESS THAN ('7000-'),
PARTITION p8000 VALUES LESS THAN ('8000-'),
PARTITION p9000 VALUES LESS THAN ('9000-'),
PARTITION pMax VALUES LESS THAN MAXVALUE
);

按字母顺序,

'10000-'
位于
'1000-'
'2000-'
之间。您必须以类似的方式订购任何其他分区。

© www.soinside.com 2019 - 2024. All rights reserved.