分库分表设计基础

随着当今系统中的数据量越来越庞大,当我们设计系统时经常会关心数据库的性能,以及数据库是否需要做分库分表处理。数据库是否要分库分表需要由业务吞吐量、数据库品牌、数据量等多方面决定,分库分表也还分为水平切分和垂直切分。这里仅描述不同场景下,数据库做水平的情况。

我理解的数据库分库分表本质上的目的就是一次数据库查询操作所涉及的数据量,通过架构设计和数据库设计,把每一次数据库交互涉及的数据量缩小。

1. 单一key条件下的分库分表

单key查询条件是最简单的一类业务查询,假设有user表

有业务查询,按照id查询用户信息,就是单key查询条件,对应的语句是

select * from user where id=‘xxxxx‘

当user表的数据量较小时在id列上有索引(一般是主键)的情况下,这条语句效率挺高;随着业务增长系统内用户增加后,效率会逐渐下降,不同数据库产品的下降趋势不一,性能开始下降的阈值也和表内数据量有关,例如MySQL理论上单表5000万数据会出现性能急剧下降的情况,但如果是字段很多的表,在几百万数据的时候就会出现性能下降。

对于单key类业务的表,一般会选择按照这个key的情况来进行水平切分,以user表为例的话 key就是id。水平切分一般有by range和by hash两种常见方式。

  • By range

By range是指通过id的值的范围去把数据切分到不同的表或者数据库里,比如说id在1~100000的数据放在user_t1表,id在100001~200000的数据放在user_t2表。

这种切分的优点:

切分简单,软件架构路由规则简单;线性扩容方便,再多数据,再多加几个表或者库就好。

缺点也很明显:

在id分布不均匀时,会出现某几个表热度很高,而其他表访问量低的情况。

  • By hash

By hash是解决By range方式中id分布不均匀的场景的解决方案,通过对id进行哈希后的值再拆分,无论原来id分布情况如何,经过哈希后都会变成分布较为均匀的值。

优点:

切分简单,数据分布均匀

缺点:

扩容时需要用新的哈希算法rehash一下,会引起数据迁移,需要在扩容时考虑数据如何平滑迁移。

数据平滑迁移一般可以这么做

假设我们原来的分库是下面这样,通过id取2的模的方式分库。

需要扩容时,采取通过id取4的模的方式分库,可以先配置好应用,再中断已有2套数据库的主备复制的方式扩容,无数据迁移,如下图所示。

平滑扩容后对4个库里的数据进行清洗,删除不要的数据,再重新进行主备库搭建后,完成平滑扩容。

2. 双key条件下的分库分表

但是实际应用中,一般不会只按一个维度进行数据访问,按单一key方式分库分表后,其他维度的数据访问,就变得需要遍历所有库才能完成了。假设60%是通过id查询,30%是通过name查询,还有10%是其他维度的查询组合。这种情况下,按id分表意味着name和其他维度的查询需要遍历所有的库才能得出结果。在name和id的查询需要兼顾的时候,通过id分库对于name维度查询就是无法接受的结果。

对于这种查询,可以通过在id里融合name信息的方式做分表来解决,假设通过id = uuid + hash(name)方式生成用户的id列。再通过hash(id里由name哈希来的部分)进行分库。这样具有相同hash值的name列也会在同一个库里,通过id查询时通过uuid里hash(name)的部分也可以定位出该id的数据位于哪个库。

说的很抽象,举个例子,name%8 = 3, id = uuid(63)+“3”,分库策略为对id最后1位模2,这样就既能保证通过id的查询能直接定位到库(取最后一位的数字模2),也能保证通过name的查询能直接定位到库(模8后再模2)。在这个例子的前提条件下,可以使id上60%的查询和name上30%的查询不需要遍历全库,且最高支持分8片(最高支持的分片数取决于name字段的哈希结果,模16就可以最多支持16分片了)。

原文地址:https://www.cnblogs.com/aegis1019/p/9149387.html

时间: 2024-08-30 04:23:20

分库分表设计基础的相关文章

MySQL分库分表方案

1. MySQL分库分表方案 1.1. 问题: 1.2. 回答: 1.2.1. 最好的切分MySQL的方式就是:除非万不得已,否则不要去干它. 1.2.2. 你的SQL语句不再是声明式的(declarative) 1.2.3. 你招致了大量的网络延时 1.2.4. 你失去了SQL的许多强大能力 1.2.5. MySQL没有API保证异步查询返回顺序结果 1.2.6. 总结 MySQL分库分表方案 翻译一个stackoverflow上的问答,关于分库分表的缺点的,原文链接: MySQL shard

数据库分库分表

1. 数据库分库分表 1.1. 前言 1.1.1. 名词解释 1.2. 数据库架构演变 1.3. 分库分表前的问题 1.3.1. 用户请求量太大 1.3.2. 单库太大 1.3.3. 单表太大 1.4. 分库分表的方式方法 1.4.1. 垂直拆分 1.4.2. 水平拆分 1.5. 分库分表后面临的问题 1.5.1. 事务支持 1.5.2. 多库结果集合并(group by,order by) 1.5.3. 跨库join 1.6. 分库分表方案产品 1.7. 为什么不建议分库分表 1.8. 参考

sharding-jdbc结合mybatis实现分库分表功能

最近忙于项目已经好久几天没写博客了,前2篇文章我给大家介绍了搭建基础springMvc+mybatis的maven工程,这个简单框架已经可以对付一般的小型项目.但是我们实际项目中会碰到很多复杂的场景,比如数据量很大的情况下如何保证性能.今天我就给大家介绍数据库分库分表的优化,本文介绍mybatis结合当当网的sharding-jdbc分库分表技术(原理这里不做介绍) 首先在pom文件中引入需要的依赖 <dependency> <groupId>com.dangdang</gr

记录一次经历的数据库从单库到分库分表的过程

前言 目前所在的的项目组,由于项目正在处于一个业务爆发期,每天数据的增长量已经给我们数据库乃至系统造成了很多不确定的因数,前期依靠优化业务和SQL等方式暂时还能够支撑住.但是最近发现某些表数据达到500W+以后查询统计性能严重下降,高峰时段出现了很多SQL阻塞的情况例如: 这种阻塞带来的灾难是滚雪球的,由于越堆越多基本上把数据库已经拖死,所以我们就面临数据库切分的问题. 技术选型 既然要分库分表那数据库集群是少不了的,那我们的项目怎样和这些集群打交道呢?我调研了大概分为以下几种来完成这个功能(仅

分库分表之后的搜索策略

所谓分库,就是把原来在一个库中的数据放到多个库中存储: 分表就是把原来在一个表中的数据放到多个表中存储. 这里不讨论分库分表的策略和具体实现,主要想记录的一点,就是分库分表后的搜索如何实现? 工作中遇到的是通过将库.表中的数据抽取出来,可用的工具有Solr.ElasticSearch等, 对你想要查询的字段建立索引,形成搜索库,这个搜索库和原来对表的搜索差不多,不同的是,搜索这个库并不是为了获取记录的完整数据. 完整的记录数据是通过查询条件在搜索库中找到满足条件的记录的id,然后通过获取的id再

Mycat读写分离和分库分表配置

Mycat是一个开源的分布式数据库系统,不同于oracle和mysql,Mycat并没有存储引擎,但是Mycat实现了mysql协议,前段用户可以把它当做一个Proxy.其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端mysql存储引擎里面.最新版本的Mycat不仅支持mysql,还可以支持MS SqlServer,Oracle,DB2等关系型数据库,而且还支持MongoDB这种NoSQL.Mycat对调用者屏蔽了后端存储具体实现. Mycat的原理是先拦截用户的SQL语句并做分

TSharding:用于蘑菇街交易平台的分库分表组件

tsharding TSharding is the simple sharding component used in mogujie trade platform. 分库分表业界方案 分库分表TSharding TSharding组件目标 很少的资源投入即可开发完成 支持交易订单表的Sharding需求,分库又分表 支持数据源路由 支持事务 支持结果集合并 支持读写分离 TSharding Resources Abstract TSharding Resources Classes TSha

关系型数据库分库分表解决方案

关系型数据库分库分表解决方案 关系型数据库单库或单表在数据达到一定量级后,单个节点的就会出现性能瓶颈.通常的做法就是考虑分库分表. 为什么要分? 分库降低了单点机器的负载:分表,提高了数据操作的效率,尤其是Write操作的效率. 如何分? 按号段分: (1) user_id为区分,1-1000的对应DB1,1001-2000的对应DB2,以此类推:优点:可部分迁移缺点:数据分布不均 (2)hash取模分: 对user_id进行hash(或者如果user_id是数值型的话直接使用user_id 的

分库分表实践之路

对于大型数据分库分表实践可以参考:http://dbaplus.cn/news-10-264-1.html http://leibinhui.iteye.com/blog/1949056 http://geek.csdn.net/news/detail/62793 http://dataunion.org/14895.html http://blog.csdn.net/column/details/sharding.html