数据库的分库分表的一些总结
2017-09-24 22:27
176 查看
1. 把一个实例中的多个数据库拆分到不同的实例。
1.1 比如把订单,用户和促销的节点一分为订单节点一,用户节点二,促销节点三。
2. 把一个库中的表分离到不同的数据库中。
3. 对一个库中的相关表进行水平拆分到不同实例的数据库中。(可以使用oneProxyp中间件来控制)
3.1 选择分区键值
(1)分区键要能尽量避免跨分片查询的发生;(2)分区键要能尽量使各个分片中的数据平均。
3.2 存储无需分片的表的方式
(1)每个分片中存储一份相同的数据优点:可以联表查询,并且对业务逻辑也不会太大改变;
缺点:造成了数据冗余。
(2)使用额外的节点统一存储
优点:不会造成数据冗余;
缺点:是不能连表查询,得通过程序来合并查询的数据,所以查询效率较(1)差一些。
3.3 在节点上部署分片,有三种常用方式
(1)每个分片使用单一数据库,并且数据库名也相同;(2)将多个分片表存储在一个数据库中,并在表名上加入分片号后缀;
(3)在一个节点中部署多个数据库,然后将数据库名进行编号,每个数据库包含一个分片;
3.4 分配分片中的数据的方式
(1)按分区键的Hash值取模来分配分片数据优点:能相对平均分配数据到每个分片中;
缺点:很难决定什么样的数据分配到哪个分片中。
(2)按分区键的范围来分配分片数据
优点:能清楚知道分区键在哪个分片中;
缺点:可能造成数据分配和访问量不平均。
(3)利用分区键和分片的映射表来分配分片数据。
优点:能平均分配数据到每个分片中;
缺点:该表读压力会很大,很可能会造成影响性能的瓶颈,所以建议开启缓存。
3.5 分片生成全局唯一ID的方式
(1)使用auto_increment_increment(自增步长)和auto_increment_offset(自增开始数)(参数适用于一个节点中只保存一个数据表,如果一个节点中有多个数据表就不能使用该方式);(2)使用全局节点来生成ID(可能造成系统的性能瓶颈);
(3)在Redis等缓存服务器中创建全局ID(因为redis读写效率远大于mysql,所以建议使用)。
相关文章推荐
- php连接数据库的一些总结(希望大家可以回复交流)
- 关系数据库的查询优化策略----总结了一些查询优化的方法,希望可以对大家有所帮助(原创)
- 关于写程序时「对数据库操作」的一些总结。
- 数据库一些指令总结
- Atitit 数据库与存储引擎设计与实现 attilax总结 1.1. 数据库的实现有很多种, 遵循一些理论规范,如 Fix Rules、Write-Ahead Log、Force-log-at-
- 自己总结一些操作数据库的方法
- Java对数据库的调用一些常用方法总结
- Netbeans开发桌面数据库程序时的一些小问题总结
- 关于过去工作的一些总结:常用sql语句以及数据库查询优化
- 数据库约束的一些用法总结(constraint)
- Informix数据库临时表的一些总结
- 超大数据量存储常用数据库分表分库算法总结
- 总结一些关于操作数据库是sql语句还是存储过程问题
- 移动端轻量级数据库SQLite以及FMDB框架的一些总结
- 一些常用又容易忘记的数据库总结
- Java中Date插入数据库的一些问题总结(二)
- 数据库表结构设计的一些总结
- 关于jquery 的ajax调用的一些总结(记录插入数据库成功,但ajax返回false)
- java与数据库连接过程中的一些小总结
- 数据库复习的一些小总结