使用分区表的时候,看文档说是要创建全局索引,最佳实践是使用id+分区列做聚簇索引,再给id创建全局唯一索引,但是,表已经用id创建了聚簇索引,又没法修改删除了,怎么办
这要结合你的sql查询是什么样的来看的。
你的sql是根据id的点查多,那么现在确实是有点难办。因为id已经没法变成全局索引了。然后id又不是分区列,如果不带分区列的id点查,是不好裁剪分区。
这种情况现在确实是除了重建表没有更好的办法了。
但我感觉实际情况大概率没这么差,因为真要这样,你早就发现性能没法用。所以你大概率现在根据id的点查,已经是带着分区列和id的了。
那么这种sql不用全局索引,我估计性能也不会差很多的。
没有性能问题就可以不建啊,这个没有啥必须的。表已经用 id 建了聚簇索引,说明你的 id 就是分区列,用着没问题即可。
目前来说是无解的,聚簇索引一旦设置了,除非主键里包含分区列,否则基本就和分区表无缘了,更别说全局唯一索引了。
这一点其实也希望官方能推动优化,能支持将聚簇索引改成非聚簇索引,现在用上聚簇索引,基本就和分区表无缘了。
如果想当成数仓来用 TiDB,强烈建议把 tidb_enable_clustered_index
关闭,默认创建非聚簇索引,后续不管是读写热点拆分,还是想通过分区化改造来做冷热分离,都很方便。
PS:当然如果是 TP 类的业务居多,还是老老实实用聚簇索引吧,并发读写的 Latency、和对 TiDB 的冲击都能小很多
问题是这么搞的话需要用 reorg partition 的方法来重建分区表,reorg partition 可能并没有把普通表的数据导出再导入来的效率高。
其实如果只是为了冷热分离,可以创建一个临时表,这个临时表的第一个分区里包含所有当前的数据,然后通过EXCHANGE PARTITION 的方式,直接将表数据迁移到该分区中,然后互换下表名。
随着时间推移,可以一次性把历史数据都挪到冷数据盘上,这样就低成本的做好了冷热分离。
另外先别说性能问题了,reorg partition 对聚簇索引的适应范围很小,只适用于聚簇索引里包含分区键的情况,其他情况你想用都用不了。。