PolarDB之前普通表有的索引,转换成分区表后是不是得创建全局二级索引才是一样的效果呢?还是创建成部分索引也可以?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在PolarDB中,普通表转换为分区表后,是否需要创建全局二级索引(GSI)或部分索引(Partial Index),取决于具体的查询场景和业务需求。以下是详细分析:
普通表的索引是针对整个表构建的,而分区表的索引分为局部索引和全局索引两种: - 局部索引:每个分区独立维护自己的索引,索引数据仅在分区内有序。 - 全局索引:跨所有分区构建,索引数据对整个表全局有序。
因此,当普通表转换为分区表后,如果希望保留与普通表相同的查询性能,通常需要根据查询模式选择合适的索引类型。
全局二级索引适用于以下场景: - 查询条件中不包含分区键,但需要快速定位数据。 - 需要保证索引字段的全局唯一性(通过全局唯一索引UGSI实现)。 - 查询结果需要跨分区排序时,避免额外的全局排序操作。
例如,假设原普通表有一个基于user_id
的索引,转换为分区表后,如果查询条件中不包含分区键(如order_id
),则需要创建全局二级索引来避免全分区扫描。
CREATE GLOBAL INDEX g_i_user_id ON t_order (user_id) PARTITION BY HASH(user_id);
部分索引适用于以下场景: - 不同分区的数据分布和查询模式差异较大。 - 某些分区上的查询频率较高,而其他分区查询较少。 - 希望减少索引存储开销,仅在特定分区上创建索引。
例如,假设分区表t_order
按region
分区,且只有某些区域(如region='east'
)的查询频繁,则可以为这些分区单独创建部分索引。
CREATE INDEX p_i_east ON t_order (user_id) WHERE region = 'east';
根据查询模式和业务需求,选择合适的索引类型: - 全局二级索引(GSI): - 适合跨分区的查询场景。 - 如果查询条件中不包含分区键,建议使用GSI以避免全分区扫描。 - 如果需要全局唯一性约束,必须使用全局唯一索引(UGSI)。 - 部分索引(Partial Index): - 适合分区间查询模式差异较大的场景。 - 如果某些分区的查询频率远高于其他分区,可以为这些分区单独创建部分索引。
在选择索引类型时,需注意以下限制: - 全局二级索引的限制: - 仅支持InnoDB引擎的分区表,不支持混合分区表、压缩表、临时表等。 - 创建全局二级索引的列不能为主表的主键。 - 分区级别的DDL变更(如新增RANGE或LIST分区)可能导致全局二级索引失效,需重建索引。 - 部分索引的限制: - 部分索引仅对满足过滤条件的分区生效,无法覆盖全表查询。
通过合理选择索引类型,可以在分区表中实现与普通表类似的查询性能,同时充分利用分区表的优势。
阿里云关系型数据库主要有以下几种:RDS MySQL版、RDS PostgreSQL 版、RDS SQL Server 版、PolarDB MySQL版、PolarDB PostgreSQL 版、PolarDB分布式版 。