本文汇总了 PolarDB MySQL版 分区表相关的常见问题。

PolarDB MySQL版 是否支持表分区?

支持。目前 PolarDB MySQL版 100%兼容MySQL,同时做了功能和性能的增强,详情请参考 分区表概述

PolarDB MySQL版 一张表最多支持多少个分区?

最多支持8192个分区。如果定义了二级分区,则是所有二级分区的总和最多支持8192个。

数据量有多大适合使用分区表?

使用分区表数据量没有下限,空表也可建分区表,但数据量太少没必要分区,一般普通表大于500 MB可以选择使用分区表。当单分区数据量超过64 TB(与单个普通表一致),最大分区数超过8192时不适合使用分区表。建议单表数据量超过1 TB或者500万行尽量使用分区表。

分区表创建多少个分区比较合适?

在满足分区不超过8192个的前提下,根据业务场景和数据量决定分区数。

单分区数据量大概多少合适?

单个分区建议数据行数在500万至5000万之间,如果行长超过4 KB的话建议不超过500万行。

如何使用分区表?

通常分区和业务有很大关系。如果业务数据和时间相关,建议使用时间范围分区,如果业务数据与地域和租户相关,可以使用List分区或者Hash分区,或者 LIST DEFAULT HASH 分区。如果一级分区数据过多,可以使用二级分区。具体请参考 分区选择策略

使用 PolarDB MySQL版 数据库是否需要分库分表?

不需要。考虑使用分区表代替分库分表。 PolarDB MySQL版 是基于共享存储和一写多读的计算存储分离架构的集中式数据库,单分区或单表数据量最大64 TB,不必过早考虑分库分表。

使用 PolarDB MySQL版 数据库,单张表数据量太大 ,想使用分表,如何使用?

建议使用分区表。分区表的更多介绍请参见 分区表概述

如果用户有个过亿数据的单表,有什么好的优化建议?

建议使用分区表。分区表的更多介绍请参见 分区表概述

PolarDB MySQL版 中如果单表数据记录条数达到亿级,是否需要做分库分表?还是选择分区表?

建议使用分区表。分区表的更多介绍请参见 分区表概述

PolarDB MySQL版 数据库支持对表进行分区的操作吗?在 PolarDB MySQL版 中对表进行分区是否有意义?

是的,分区表把数据切分成小的分片独立管理,从而使得拥有大数据量的表仍然拥有高性能和高可用。分区表的更多介绍请参见 分区表概述

业务上估算单张表的数据量为2 TB,选择使用 PolarDB MySQL版 还是PolarDB-X?

PolarDB MySQL版 单表最大支持到64 TB, 2 TB的数据量相对较小,所以推荐使用 PolarDB MySQL版 。因为数据量超过1 TB,建议使用分区表。

遇到“ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function”报错,如何处理?

数据库中分区表的定义要求主键必须包含分区键来保证数据的唯一性。 PolarDB MySQL版 可以通过指定 UNIQUE CHECK IGNORE 关键字来允许主键不包含分区键,用来提高性能和降低索引使用空间。

PolarDB MySQL版 分区表的主键和唯一索引是否必须包含分区键?

对于原生MySQL如果含有唯一索引或者主键,分区列必须包含在所有的唯一索引或者主键内。

PolarDB MySQL版 支持 UNIQUE CHECK IGNORE 属性,可以解绑主键或唯一键与分区键的包含关系,使得主键、唯一索引和分区键的选择更加灵活。

PolarDB MySQL版 分区表支持本地索引吗?是否支持给指定的一级分区或二级分区添加二级索引?

支持。具体请参见 部分索引

分区表是否支持FULLTEXT全文索引?

不支持

分区表是否支持空间类型,如POINT或者GEOMETRY?

不支持

分区表是否支持用户临时表?

不支持

分区表是否支持外键?

不支持

二级分区是否支持Range和List?

支持。具体请参考 分区表类型和使用说明

分区表是否支持列存索引?

支持

分区表是否支持X-Engine?

不支持

创建和删除分区表时,是否会锁表?

PolarDB MySQL版 8.0.2版本支持分区粒度锁,只锁住当前操作的分区,避免了大事务阻塞DDL,从而不影响其他分区的DML操作。具体请参考 在线分区维护

使用 PolarDB MySQL版 分区,会不会导致性能下降?

与单表相比,扫描相同的数据量,分区表的扫描有分区间切换的代价,会存在性能损耗。相同数据量的情况下,单表只有一个B+树,分区表是每个分区一个B+树,树的层级相对较低,insert性能会更好;分区表能使用where条件进行分区剪枝的查询场景可以减少数据的扫描和计算,性能也会更优;相对于分库分表,使用分区表在做JOIN、DDL时,性能上也有优势。

PolarDB MySQL版 的分区表功能会单独收费吗?

分区表能力是内核的内置能力,不收费。

使用分区表时,是否需要调整参数的设置?

建议打开分区粒度的MDL锁。具体请参见 在线分区维护

在源端的数据库中某张表是不分区的,通过DTS迁移到目标数据库中,需要对该表进行分区,是否支持?

支持。在数据同步任务中手动创建好分区表的结构,然后配置映射关系进行数据同步即可。

大版本升级过程中,是否可以把普通单表转换为分区表?

可以。具体操作步骤如下:

  1. 需要先在源库中添加一个无主键的辅助表,如 create table t1 (a int) ,这样可以确保大版本升级过程中的预检查失败任务中断;

  2. 开始进行大版本升级任务,直到预检查失败;

  3. 在目标库创建分区表(该步骤需要前往 配额中心 ,在配额名称 PolarDB MySQL版 大版本升级 操作 列,单击 申请 解决 );

  4. 删除辅助表,如 t1 。单击继续升级(不跳过预检查),DTS预检查会再报目标库有同名表的错误;

  5. 在DTS控制台屏蔽掉该报错,重新开始预检查,预检查成功后,任务正式开始同步;

  6. 只要保证分区表和普通单表的数据存储格式完全一致,后续的同步任务都会顺利完成。

分区表只能对数据表的整型列进行分区吗?

可以使用KEY、RANGE COLUMN和LIST COLUMN语法对非整型数据的列进行分区。具体请参考 KEY RANGE LIST 。您也可以通过分区函数把数据列转化成整型列,来使用HASH/RANGE/LIST分区表。

分区表有什么使用上的限制?

  • 最大分区数不能超过8192个。

  • 单分区数据量最大64 TB。

  • 如果含有唯一索引或者主键,默认分区列必须包含在所有的唯一索引或者主键内。

    PolarDB MySQL版 支持 UNIQUE CHECK IGNORE 属性,可以解绑主键或唯一键与分区键的包含关系,使得主键、唯一索引和分区键的选择更加灵活;唯一全局二级索引可以不包含分区键。

  • 不支持外键。

  • 不支持全文索引(FULL TEXT)。

如何创建分区表?

在创建表时通过 PARTITON BY 语法来创建。不同类型分区表的创建方法,请参见 分区表类型和使用说明

如何指定分区键?

通过 part_expr 来指定分区键。具体请参见 分区表类型和使用说明

PolarDB MySQL版 的分区支持是否和 一样?

PolarDB PostgreSQL版分区表的分区是子表,每个分区是独立的表, PolarDB MySQL版 的分区是InnoDB表,从Server层看每个分区不是独立的表。

PolarDB MySQL版 的数据表进行分区,性能提升是否明显?

对于按照分区键过滤条件进行分区剪枝的查询性能会有明显提升,另外 PolarDB MySQL版 对分区表做了性能优化,具体请参见 分区表概述

对于大批量的数据,例如一张表一天有1000万行新数据,一个月就3亿行,PolarDB如何应对?

请参见文档 INTERVAL RANGE 自动化管理分区 。可以打开 在线分区维护 功能,在自动增加和删除分区时不阻塞其他分区上的DML操作。

分区表支持事务吗?

支持。

使用分区表是否需要分库分表分布式事务?

不需要。

分区的写入性能能提升吗?不同分区的数据写入相互阻塞吗?

在大数据量的情况下,是能够提升写入性能的。不同分区的写入是完全不阻塞的。

增加分区会导致锁超时吗?

使用 在线分区维护 功能可以避免这个情况的发生。

为什么DROP分区会导致整个表的业务阻塞?

在原生MySQL中DROP分区会获取整表的MDL锁,导致所有写入访问被阻塞。 PolarDB MySQL版 支持分区粒度的MDL锁。因此只会阻塞正在DROP的分区的DML,不阻塞其他分区的DML, 最大限度减少对业务的影响。

分区对查询和读写性能有影响吗?

建议在SQL语句中指定分区键,可以减少对性能的影响。

OPTIMIZE TABLE在分区表上是如何进行的?

OPTIMIZE TABLE会对整个分区表上MDL锁,阻塞所有分区上的DML操作。建议您使用 REBUILD PARTITION 命令并结合 在线分区维护 功能,这样只会阻塞当前重建分区的DML操作,不阻塞其他分区的DML操作, 最大限度减少对业务的影响。

分区表如果需要做数据删除,如何操作比较安全?

您可以创建一个新的相同定义的临时空表,然后将需要删除数据的分区做 EXCHANGE PARTITION ,再将临时表删除。

为什么分区表查询计划不准确?

分区表查询计划不准确主要的原因是统计信息不准确,在8.0.2版本中已经针对这个问题做了分区级别统计信息优化,建议您将版本升级到8.0.2。

PolarDB MySQL版 的物理表如何分区?

一般情况下,每个分区是一个Innodb表, Hybrid分区可以放在其他存储引擎上。

误删了一个表的分区数据,能否恢复?

目前仅支持库表级的恢复,不支持分区级的数据恢复。

分区数太多,导致内存耗尽,如何解决这个问题?

PolarDB MySQL版 8.0.1和8.0.2版本中,不存在该问题,分区的内存都是共享的。建议您升级您的内核版本。

为什么添加分区的(ADD PARTITION)操作耗时长,如何避免?

操作耗时长是因为在该分区表上有大事务正在进行。 PolarDB MySQL版 8.0.2版本支持分区粒度的MDL锁只会阻塞正在添加分区的DML操作,不阻塞其他分区的DML操作, 最大限度减少对业务的影响。

PolarDB可以自动创建表分区吗?

可以。具体请参见 INTERVAL RANGE简介 自动化管理分区

使用自动化分区管理功能时,在RW节点创建的event是否会在RO节点执行?

PolarDB MySQL版 是共享存储的架构,在RW节点上创建的event不会在RO节点执行,参数选择 ENABLE 即可。

使用自动化分区管理功能时,集群 发生主备切换之后,新的RW节点是否可以继续执行event?

发生HA之后,新的RW节点是可以继续执行event的。

使用自动化管理分区时,参数event_scheduler是否需要在RW和RO节点都设置成ON?

RO节点不需要设置为ON,只需要设置RW节点为ON即可。

单表转分区表需要多长时间,以100 GB数据量的表为例?

如果使用 普通表快速转RANGE分区表 功能,可以秒级转换;如果您的业务场景 不符合普通表快速转分区表的场景,您可以使用 ALTER TABLE PARTITION BY 来重写表中的全部数据,用时大约1~2个小时,实际用时与您的集群规格和业务负载等有关。