【干货】分库分表最佳实践
何时分库分表
MySQL单表(innoDB)可以存储10亿级数据,只是这时候性能比较差,业界公认MySQL单表容量在1KW以下是最佳状态,因为这时它的BTREE索引树高在3~5之间。
参考阿里开发手册建议:
1.单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表;如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。
2.实际情况受mysql机器配置等多方面影响,可能数据量很大但性能依旧不错,但考虑后续发展一定要进行分库分表考虑。
如何分库分表
设置合适的分片数量
根据实际的业务场景选择合适的分片数据,参考如下:
- 满足当前数据平均后的数据量在一个合理的范围(<=100w)
- 预估未来5年的数据量发展情况,数据量在一个合理的范围(500w左右,有合理的归档备份机制)
选择合适的分片字段
根据实际的业务场景选择适当的分片字段,要达到如下要求:
- 字段类型常规
- 字段不易过多
- 字段应该是业务场景大多数都会被使用的
设计合理的分片规则
分表数量和分表字段确定后,要设计一个合理的分表规则,良好的分表规则要达到如下条件:
- 规则计算高效,逻辑清晰
- 规则计算后,分片数据均匀
- 方便后续扩容分片
如何保证分片数据均匀,参考:
- 分片字段本身就是随机均匀的,可以直接使用
- 分片字段随机,但不均匀,如对总分片取模后,会导致数据不均匀,建议先对分片字段进行2次随机处理(如:zebra提供的:md5/crc32 方法)
如何保证方便后续分片扩容,参考:
- 如果是按照时间或数值范围进行分片,只需要创建分片库表,修改分片规则,立即生效
- 如果是hash分片,条件允许可考虑停服迁移,停止服务,将数据按新分片规则进行迁移,修改分片规则,启动服务
- 某些情况下可考虑升级从库,如2分库扩容为4分库,可将从库升级为主库并修改分片规则,后续可将冗余的数据进行清除并补上缺失的从库。
- 数据库双写,同时按新老分片规则写入两套物理表,并逐渐下线老数据模型,可参考-新老迁移参考
SQL使用注意
如何高效的使用分库分表,核心是做到尽量的路由到最少的表,最好是只路由到一个表里面
核心规则如下:
- 能带分片字段的就尽量把其带上
- 尽量不使用范围查询
- 无分片使用limit时不要查询太靠后的数据
- 尽量不要使用复杂的sql
- sql写法尽量规范
新老迁移方案参考
阶段一
- 数据库双写(事务成功以老模型为准),查询走老模型。
- 每日job数据对账,并将差异补平。
- 通过job导历史数据。
阶段二
- 历史数据导入完毕并且数据对账无误。
- 依然是数据库双写,但是事务成功与否以新模型为准,在线查询切新模型。
- 每日job数据对账,将差异补平。
阶段三
- 老模型不再同步写入,异步补齐(同步数据终态)。
- 此阶段只有离线数据依然依赖老的模型,并且下游的依赖非常多,待改造完就可以完全废除老模型了。
【干货】分库分表最佳实践相关推荐
- 分库分表架构实践(文末送书)
作者介绍: 丁浪,现就职于某垂直电商平台,担任技术架构师.关注高并发.高可用的架构设计,对系统服务化.分库分表.性能调优等方面有深入研究和丰富实践经验.热衷于技术研究和分享. 来源:infoQ||聊聊 ...
- SQL数据库不用SQL语句能显示全表的内容_阿里巴巴数据库分库分表的实践
在2006年阿里巴巴B2B团队以开源方式研发了Cobar这一关系型数据的分布式处理系统.该系统在很大程度上解决了最初使用Oracle数据库因为存储数据变得越来越大带来的扩展性问题,并且为开发人员提供了 ...
- 唯品会订单分库分表的实践总结以及关键步骤--转
原文地址:http://www.infoq.com/cn/articles/summary-and-key-steps-of-vip-orders-depots-table 随着唯品会业务的快速发展, ...
- 唯品会订单分库分表的实践总结以及关键步骤
随着唯品会业务的快速发展,订单量的不断增长,原有的订单存储架构已经不能满足公司的发展了,特别是在大促高峰期,原订单库已经成为抢购瓶颈,已经严重制约公司的发展. 唯品会旧订单库包含几十张订单相关表,旧订 ...
- (转)唯品会订单分库分表的实践总结以及关键步骤
原文:http://www.infoq.com/cn/articles/summary-and-key-steps-of-vip-orders-depots-table 随着唯品会业务的快速发展,订单 ...
- 万亿级企业MySQL海量存储分库分表设计实践
互联网业务往往使用MySQL数据库作为后台存储,存储引擎使用InnoDB.我们针对互联网自身业务特点及MySQL数据库特性,讲述在具体业务场景中如何设计表和分表.本文从介绍MySQL相关基础架构设计入 ...
- MariaDB Spider 数据库分库分表实践
分库分表
分库分表 一般来说,数据库分库分表,有以下做法: 按哈希分片:根据一条数据的标识计算哈希值,将其分配到特定的数据库引擎中: 按范围分片:根据一条数据的标识(一般是值),将其分配到特定的数据库引擎中: ...
- 一文快速入门分库分表(必修课)
之前有不少刚入坑 Java 的粉丝留言,想系统的学习一下分库分表相关技术,可我一直没下定决心搞,眼下赶上公司项目在使用 sharding-jdbc 对现有 MySQL 架构做分库分表的改造,所以借此机 ...
- 深入浅出Mycat分库分表
What is Mycat? 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle ...
最新文章
- R有序因子和无序因子(4)
- java 获取400的错误信息_获取400错误的请求Spring RestTemplate POST
- Ext.Net学习笔记10:Ext.Net ComboBox用法
- springmvc配置ssl_spring MVC配置详解
- python字典顺序遍历_在Python中,如何按已排序的键顺序遍历字典?
- 微信开发中,H5的video标签使用
- nullnull使用PL/SQL获取创建用户的语句
- 整理的一些常用的CSS HACK
- python 读取中文文件名/中文路径
- 截取文件最后10行_10 行 Python 代码自动清理电脑内重复文件,解放双手
- Nexus3 功能介绍
- 【神经网络算法入门】详细推导全连接神经网络算法及反向传播算法+Python实现代码
- Vue开发历程---音乐播放器
- 杭州好玩景点攻略198
- 华为进不了美国,并不是贸易保护这么简单
- python中的反三角函数_用python画所有三角函数和反三角函数图像
- 【 拼多多发表声明:会认真整改 打假决心没有变】
- 我想问问4月7号什么日子
- PHP 图片合成、仿微信群头像
- 阿里云边缘云场景化商业实践
热门文章
- c语言is stack empty,C语言实现栈的问题
- java cache详解,Java内存缓存详解
- html5 文字转换烟花,HTML5交互式烟花(点击并保持)
- Scikit-Learn 机器学习笔记 -- 决策树
- linux内核杂记(14)-Linux kernel release 5.x(1)
- 趣学python3(19)-函数-Lambda
- tensorflow随笔-条件循环控制(1)
- AtCoder Beginner Contest 215 F - Dist Max 2
- 【NLP】NLP模型BERT和经典数据集!
- 【Python基础】纯Python绘制满满艺术感的山脊地图