通常来说,如果可以采用分库就尽量不要进行分片,分片后的数据表难以维护,但也会有到不得不分片的时候。
如何选择分区键
- 分区键要能尽量避免跨分区查询的发生。例如一个博客表,如果采用每一篇博客的主键ID来进行分区,查询某个用户的博客时则要跨多个分区去汇总数据,性能会比分区前更慢。所以可以考虑使用用户ID来进行分区,则只需要在一个分片中进行查询
- 分区键要能尽量使各个分片中的数据平均。分片就是为了减轻数据库的负载,如果分片后许多查询和更新都集中在一个分片上那分片就意义不大了
如何存储无需分片的表
- 每个分片中存储一份相同的数据。这种方法适合数据量小的表,可以提升关联查询的效率。
- 使用额外的节点统一存储。
如何在节点上部署分片
- 每个分片使用单一数据库,并且数据库名也相同
- 将多个分片表存储在一个数据库中,并在表名上加入分片号后缀
- 在一个节点中部署多个数据库,每个数据库包含一个分片
如何分配分片中的数据
- 按分区键的Hash值取模来分配分片数据
- 按分区键的范围来分配分区数据
- 利用分区键和分片的映射表来分配分片数据
如何生成全局唯一ID
- 使用auto_increment_increment和auto_increment_offset参数
- 使用全局节点来生成ID
- 在Redis等缓存服务器中创建全局ID