库表

更新时间:
复制 MD 格式

本文介绍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不支持通过ALTER TABLE直接修改已有表的分布字段(DISTRIBUTED BY)、分区字段(PARTITION BY)以及热数据策略(STORAGE_POLICY、hot_partition_count)。如需修改上述属性,必须新建表并迁移数据,推荐流程如下:

  1. 使用目标分布字段、分区字段及热数据策略创建新表(示例):

    CREATE TABLE ads_demo_goods_di_new (
      ...
    ) DISTRIBUTED BY HASH(id)
      PARTITION BY VALUE(DATE_FORMAT(gmt_create,'%Y%m%d')) LIFECYCLE 365
      STORAGE_POLICY='MIXED' HOT_PARTITION_COUNT=30;
  2. 通过INSERT OVERWRITE(或INSERT INTO SELECT)将原表数据写入新表:

    INSERT OVERWRITE ads_demo_goods_di_new
    SELECT * FROM ads_demo_goods_di;
  3. 数据校验无误后,使用RENAME TABLE切换表名或修改业务连接,完成切换后再删除原表。

说明

迁移风险与注意事项:

  • 数据量与耗时:亿级数据的INSERT OVERWRITE通常需要数小时甚至十余小时,实际耗时取决于实例规格、网络与负载,建议在业务低峰期执行。

  • 目标表数据可见性:INSERT OVERWRITE执行期间,目标表的新数据在任务完成前对查询不可见,任务完成后批量可见。

  • 在DMS中看不到已创建的数据库,如何解决?

    在AnalyticDB for MySQL实例上已创建数据库,本地客户端可见但DMS控制台看不到,通常由以下原因导致:

    • DMS登录账号无该库权限。

    • DMS元数据字典未同步。

    解决方法:使用有权限的账号登录DMS,并右键单击目标实例选择同步数据库刷新字典;若仍不可见,请在AnalyticDB for MySQL中确认库存在并对登录账号执行GRANT授权。

  • 并发写入冲突:若对同一张表同时执行INSERT INTO与INSERT OVERWRITE,INSERT INTO实时写入的数据可能会被INSERT OVERWRITE覆盖。请在迁移期间停止对原表/目标表的实时写入,或改用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;

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

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

如何查看某表的分片写入详情?

AnalyticDB MySQL版的分片属于底层自动管理,目前无法查看某表分片写入详情的公开视图。

如何删除索引?

执行以下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. 右键单击任意表名,然后选择批量操作表,全选所有表,单击删除表然后单击确认即可。