这是我的table
| A列|B栏|C列|D栏|
| - -|- -|- -|- -|
| 单元格1|单元2|单元格1|单元2|
| 单元3|单元4|单元3|单元4|
其中,列A是主键,列D是TINYINT列。列D仅包含0到3之间的值。(0,1,2,3)我要根据列D对此表进行分区。
我尝试用这段代码对表进行分区。ALTER TABLE to_be_partitioned PARTITION BY HASH(Column D) PARTITIONS 4;
它指出PRIMARY KEY必须包括表的分区函数中的所有列
请问如何根据D列的值对此表进行分区???
我尝试使用KEY分区类型,它也给出了一个错误。
我就知道会发生这样的事。
P0包含列D值为0的所有记录
P1包含列D值为1的所有记录
P2包含列D值为2的所有记录
P3包含列D值为3的所有记录
3条答案
按热度按时间ymdaylpp1#
演示
使用附加表和触发器提供的PK进行分区。
必须分区的表-无PK。
将用于AI PK生成的附加表格。
将生成AI PK的触发器。如果为
colA
提供了显式值,则将覆盖该值。某些插入。在第二次INSERT中,显式提供的
colA
的值被覆盖。查看最终数据状态。
| 可乐|列B|结肠|
| - -|- -|- -|
| 一个|十一|一个|
| 2个|二十二个|2个|
| 三个|一一一|一个|
| 四个|三十三人|三个|
| 五个|三百三十三|三个|
| 可乐|
| - -|
| 五个|
| 分区名称|表格_行|
| - -|- -|
| 零点|第0页|
| 一个|2个|
| 两个|一个|
| 三个|2个|
fiddle
cs7cruho2#
1.正如Akina所建议的,按LIST划分对本例是有意义的。
1.主键必须包含表分区函数中的所有列。主键必须是(Column A,Column D)或(Column D,Column A),否则将得到
SQL Error [1503] [HY000]
。或
编辑:
1.如果
col_a
是一个auto_increment列,则col_a
本身已经是唯一的。因此(col_a
,col_d
)也是唯一的。1.如果分区的目的是均匀分布数据,则下面的DDL可能适用于您:
第一次
dgiusagp3#
其他答案解释 * 如何 * 进行分区。我将解释 * 为什么您不需要 * 分区。
让我们看看会受益的
SELECT
。在这种情况下,具有
很可能和任何
PARTITION BY ...(colc)
一样快或更快。