本文介绍AnalyticDB for MySQL中库表优化的常见问题及解决方法。

说明

当常见问题场景中未明确产品系列时,表明该问题仅适用于AnalyticDB for MySQL数仓版

常见问题概览

如何合理建表?

AnalyticDB for MySQL中建表时,需要注意以下几点:

  • 分布字段的选择。AnalyticDB for MySQL是分布式数据库,数据需要根据分布字段均匀地分布在各个后台节点才能保证尽可能高的利用资源。分布字段选择不合理,会导致写入时存在热点,降低写入性能。

  • 分区字段合理性。AnalyticDB for MySQL后台以分区为粒度进行数据存储、索引的构建以及查询。每个分区的数据行数过少,可能导致查询时扫描的二级分区数较多,降低扫描性能;如果每个分区的数据行数过多,可能频繁触发该分区的索引构建,所以合理的二级分区对系统整体稳定性非常重要。

  • 复制表合理性。复制表在每个后台节点都保存一份,好处是在需要和复制表进行JOIN时,不需要对复制表进行网络传输,提高系统的并发处理能力。但对复制表进行增删改时,会对涉及的数据行进行重复多次的操作,以保证每个复制表的副本都生效。所以复制表不宜过大,也不宜对复制表频繁进行增删改查操作。

表个数的上限是多少?

更多详情,请参见使用限制

创建表后为什么看不到分区信息?

创建了分区表后,需要执行BUILD TABLE语句才能看到分区信息。BUILD TABLE的详细信息,请参见BUILD

如何修改二级分区表生命周期(lifecycle)?

使用如下语句修改二级分区表生命周期:

ALTER TABLE db_name.table_name partitions N;

是否支持修改分布字段和分区字段?

AnalyticDB for MySQL不支持修改分布字段和分区字段。如需修改分布字段和分区字段,您可以尝试如下办法:先创建临时表,并通过INSERT INTO SELECT命令把原表数据导入到临时表。删除原表后,使用正确的分布字段或者分区字段建表,再次使用INSERT INTO SELECT把临时表数据导入到新建的表。

如何查看表的所有二级分区及分区的统计信息?

执行以下SQL,可以查看表的所有二级分区及分区的统计信息:

SELECT partition_id, --分区名
          row_count, -- 分区总行数
          local_data_size, --分区本地存储所占用空间大小
          index_size, -- 分区的索引大小
          pk_size, --分区的主键索引大小
          remote_data_size --分区的远端存储所占用空间大小
FROM information_schema.kepler_partitions
WHERE schema_name = '$DB'
 AND table_name ='$TABLE' 
 AND partition_id > 0;

分片数跟什么因素有关系,是否可以自己调整?

分片数是创建集群时根据集群初始规格自动计算得出的,不支持调整分片数。

如何删除索引?

执行以下SQL删除索引。

ALTER TABLE db_name.table_name DROP KEY index_name;

参数说明和示例,请参见ALTER TABLE

如何解决删除数据库时提示“schema is not empty. ”?

云原生数据仓库 AnalyticDB MySQL 版集群中的数据库里面还有其他表,且表里面还有数据,则会导致该报错。您可以删除数据库前需要先删除库中的所有表,此时使用drop table语句删除很麻烦,建议您使用新版DMS进行批量删除。

  1. 登录数据管理DMS 5.0,选择已登录实例,单击实例名,右键单击库名,选择单库查询。

  2. 右键单击任意表名,然后选择批量操作表,全选所有表,单击删除表然后单击确认即可。