原文地址:http://blog.720ui.com/2017/mysql_core_09_multi_db_table2/

随着用户数的不断增加,以及数据量的不断增加,通过分库与分表的方式提高查询性能的同时,带来了一系列分布式困境。

数据迁移与扩容问题

前面介绍到水平分表策略归纳总结为随机分表和连续分表两种情况。连续分表有可能存在数据热点的问题,有些表可能会被频繁地查询从而造成较大压力,热数据的表就成为了整个库的瓶颈,而有些表可能存的是历史数据,很少需要被查询到。连续分表的另外一个好处在于比较容易,不需要考虑迁移旧的数据,只需要添加分表就可以自动扩容。随机分表的数据相对比较均匀,不容易出现热点和并发访问的瓶颈。但是,分表扩展需要迁移旧的数据。
针对于水平分表的设计至关重要,需要评估中短期内业务的增长速度,对当前的数据量进行容量规划,综合成本因素,推算出大概需要多少分片。对于数据迁移的问题,一般做法是通过程序先读出数据,然后按照指定的分表策略再将数据写入到各个分表中。

表关联问题

在单库单表的情况下,联合查询是非常容易的。但是,随着分库与分表的演变,联合查询就遇到跨库关联和跨表关系问题。在设计之初就应该尽量避免联合查询,可以通过程序中进行拼装,或者通过反范式化设计进行规避。

分页与排序问题

一般情况下,列表分页时需要按照指定字段进行排序。在单库单表的情况下,分页和排序也是非常容易的。但是,随着分库与分表的演变,也会遇到跨库排序和跨表排序问题。为了最终结果的准确性,需要在不同的分表中将数据进行排序并返回,并将不同分表返回的结果集进行汇总和再次排序,最后再返回给用户。

分布式事务问题

随着分库与分表的演变,一定会遇到分布式事务问题,那么如何保证数据的一致性就成为一个必须面对的问题。目前,分布式事务并没有很好的解决方案,难以满足数据强一致性,一般情况下,使存储数据尽可能达到用户一致,保证系统经过一段较短的时间的自我恢复和修正,数据最终达到一致。

分布式全局唯一ID

在单库单表的情况下,直接使用数据库自增特性来生成主键ID,这样确实比较简单。在分库分表的环境中,数据分布在不同的分表上,不能再借助数据库自增长特性。需要使用全局唯一 ID,例如 UUID、GUID等。关于如何选择合适的全局唯一 ID,我会在后面的章节中进行介绍。

总结

分库与分表主要用于应对当前互联网常见的两个场景:海量数据和高并发。然而,分库与分表是一把双刃剑,虽然很好的应对海量数据和高并发对数据库的冲击和压力,但是却提高的系统的复杂度和维护成本。

因此,我的建议:需要结合实际需求,不宜过度设计,在项目一开始不采用分库与分表设计,而是随着业务的增长,在无法继续优化的情况下,再考虑分库与分表提高系统的性能。

分库与分表带来的分布式困境与应对之策相关推荐

  1. access 分表存储_sharding:谁都能读懂的分库、分表、分区

    本文通过大量图片来分析和描述分库.分表以及数据库分区是怎样进行的. 1.sharding前的初始数据分布 在本文中,我打算用高考考生相关信息作为实验数据.请无视表的字段是否符合现实,也请无视表的设计是 ...

  2. 分库分表原因,分库分表的方式,分库分表带来的问题

    分库分表 1 为什么分库分表 ​ 随着平台的业务发展,数据可能会越来越多,甚至达到亿级.以MySQL为例,单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而明显降低.单表的数据量 ...

  3. 【转载】分布式数据库架构--分库、分表、排序、分页、分组、实现

    MySQL分库分表总结: 单库单表 : 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 : 随着用户数量的增加, ...

  4. mysql分布式数据库架构_MySQL分布式数据库架构:分库、分表、排序、分页、分组、实现教程...

    MySQL分库分表总结: 单库单表 : 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 : 随着用户数量的增加, ...

  5. 分布式数据库架构--分库、分表、排序、分页、分组、实现

    MySQL分库分表总结: 单库单表 : 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 : 随着用户数量的增加, ...

  6. MySQL分库、分表、分区的区别

    1.1 分 很多技术都运用了分的编程思想,这里来举几个例子,这些都是分的思想 集中式服务发展到分布式服务 从Collections.synchronizedMap(x)到1.7ConcurrentHa ...

  7. 10分钟速解 | 大型分布式电商系统架构

    关注公众号"Java后端技术全栈" 回复"电子书"获取程序员必备电子书 hi,大家好,今天是周四了,明天就开始国庆长假了. 提前祝大家国庆快乐!也祝祖国繁荣富强 ...

  8. 【分库、分表】MySQL分库分表方案

    一.Mysql分库分表方案 1.为什么要分表: 当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了.分表的目的就在于此,减小数据库的负担,缩短查询时间. ...

  9. mysql大数据分库和分表 php解决方案

    当Mysql数据量过大时,就会面临压力分解,这时分库分表是一个不错的解决方案,现在我们就来谈谈Mysql如何分库分表比较理想,然后再用php如何调用. 1,主从复制,读写分离 对主库修改数据,查询使用 ...

最新文章

  1. NPOI读取Excel数据应用
  2. 牛客2018校招 1. 拼多多 大整数相乘
  3. char和varchar的区别以及尾部空格问题 - sqlserver演示
  4. mysql 存储过程 排序_更改MySQL存储过程“数据库排序规则”的名称
  5. 超详细的8psk调制解调通信系统讲解与仿真
  6. VMware找不到父磁盘 父虚拟磁盘在子虚拟磁盘创建之后被修改过。父虚拟磁盘的内容 ID 与子虚拟磁盘中对应的父内容 ID 不匹配
  7. Oracle 11.2.0.4.0 Dataguard部署和日常维护(7) - Dataguard Flashback篇
  8. app能不能跳转外部h5_利用条件编译在app端使用h5+(网页跳转 实例)
  9. 【iOS】打印方法名
  10. VS2015 C#6.0 中的那些新特性(转)
  11. MS SQL 2008数据库完全卸载指南
  12. PDF文档阅读软件眼睛保护色设置参数
  13. 我的世界boat运行库JAVA10_我的世界boat运行库
  14. DirectVobSub(VsFilter)的基本原理和实现实现
  15. 新版游戏陪玩约玩APP源码 多人连麦聊天/语音直播社交双端APP源代码 附搭建教程文档
  16. 微信html5展示页,H5科普|微信H5页面的展示形式
  17. Java操作Word图表
  18. Java集合(超详细-含源码)
  19. 每日新闻丨​滴滴发布AI技术与解决方案开放平台;中关村发布超300亿创新母基金...
  20. TIA Portal面向对象编程入门

热门文章

  1. 微信H5视频全屏/不全屏/自动播放等相关问题解决
  2. nova launcher_如何安装Nova Launcher以获得更强大,可自定义的Android主屏幕
  3. js给span赋值及修改span字体颜色
  4. K65 Flex_CAN模块初始化
  5. 实用小工具 -- 在线查看别人网站流量
  6. gis可达性分析步骤_消息速递 | 学院2017级城市管理本科班GIS课程作业成果汇报顺利进行...
  7. 【渝粤教育】国家开放大学2018年春季 8622-21T社会调查研究与方法 参考试题
  8. 阻容压降电路调试心得
  9. 徐无忌MySQL笔记:乐观锁VS悲观锁
  10. 设计一个回合制战斗系统Combat(C++)