分表分库时机选择及策略

转载自   分表分库时机选择及策略

一. 分表

应用场景:

对于大型的互联网应用来说,数据库单表的记录行数可能达到千万级甚至是亿级,并且数据库面临着极高的并发访问。采用Master-Slave复制模式的MySQL架构,只能够对数据库的读进行扩展,而对数据库的写入操作还是集中在Master上,并且单个Master挂载的Slave也不可能无限制多,Slave的数量受到Master能力和负载的限制。

因此,需要对数据库的吞吐能力进行进一步的扩展,以满足高并发访问与海量数据存储的需要!

设计策略

      对于访问极为频繁且数据量巨大的单表来说,我们首先要做的就是减少单表的记录条数,以便减少数据查询所需要的时间,提高数据库的吞吐,这就是所谓的分表!

      在分表之前,首先需要选择适当的分表策略,使得数据能够较为均衡地分不到多张表中,并且不影响正常的查询!

      对于互联网企业来说,大部分数据都是与用户关联的,因此,用户id是最常用的分表字段。因为大部分查询都需要带上用户id,这样既不影响查询,又能够使数据较为均衡地分布到各个表中(当然,有的场景也可能会出现冷热数据分布不均衡的情况),如下图:

 

假设有一张表记录用户购买信息的订单表order,由于order表记录条数太多,将被拆分成256张表。

拆分的记录根据user_id%256取得对应的表进行存储,前台应用则根据对应的user_id%256,找到对应订单存储的表进行访问。

这样一来,user_id便成为一个必需的查询条件,否则将会由于无法定位数据存储的表而无法对数据进行访问。

注:拆分后表的数量一般为2的n次方,就是上面拆分成256张表的由来!

假设order表结构如下:

 create table order_(order_id bigint(20) primary key auto_increment,user_id bigint(20),user_nick varchar(50),auction_id bigint(20),auction_title bigint(20),price bigint(20),auction_cat varchar(200),seller_id bigint(20),seller_nick varchar(50)
)

那么分表以后,假设user_id = 257,并且auction_id = 100,需要根据auction_id来查询对应的订单信息,则对应的SQL语句如下:

select * from order_1 where user_id=257 and auction_id = 100;

其中,order_1是根据257%256计算得出,表示分表之后的第一张order表。

 

二. 分库

 应用场景:

分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,从而提高数据库写入能力,这就是所谓的分库!

 

设计策略

与分表策略相似,分库可以采用通过一个关键字取模的方式,来对数据访问进行路由,如下图所示:

 

    还是之前的订单表,假设user_id 字段的值为258,将原有的单库分为256个库,那么应用程序对数据库的访问请求将被路由到第二个库(258%256 = 2)。

 

三. 分库分表

应用场景:

有时数据库可能既面临着高并发访问的压力,又需要面对海量数据的存储问题,这时需要对数据库既采用分表策略,又采用分库策略,以便同时扩展系统的并发处理能力,以及提升单表的查询性能,这就是所谓的分库分表。

设计策略

分库分表的策略比前面的仅分库或者仅分表的策略要更为复杂,一种分库分表的路由策略如下:

    1. 中间变量 = user_id % (分库数量 * 每个库的表数量)

    2. 库 = 取整数 (中间变量 / 每个库的表数量)

    3. 表 = 中间变量 % 每个库的表数量

同样采用user_id作为路由字段,首先使用user_id 对库数量*每个库表的数量取模,得到一个中间变量;然后使用中间变量除以每个库表的数量,取整,便得到对应的库;而中间变量对每个库表的数量取模,即得到对应的表。

分库分表策略详细过程如下:

假设将原来的单库单表order拆分成256个库,每个库包含1024个表,那么按照前面所提到的路由策略,对于user_id=262145 的访问,路由的计算过程如下:

1.  中间变量 = 262145 % (256 * 1024) = 1

2.  库 = 取整 (1/1024) = 0

3.  表 = 1 % 1024 = 1

这就意味着,对于user_id=262145 的订单记录的查询和修改,将被路由到第0个库的第1个order_1表中执行!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html session 登录页面跳转页面跳转页面,session失效后跳转到登陆页面

一、编写Filter拦截器类package com.pv.utils;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;public …

pagerAdapter 与FragmentPagerAdapter的区别

转自:http://blog.csdn.net/dreamzml/article/details/9951577 ViewPager ViewPager 如其名所述,是负责翻页的一个 View。准确说是一个 ViewGroup,包含多个 View 页,在手指横向滑动屏幕时,其负责对 View 进行切换。为了…

2015蓝桥杯省赛---java---A---2(星系炸弹)

题目描述 思路分析 方案一 方案二 package TEST;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;class Main{public static void main(String[] args) {SimpleDateFormat dateFormat new SimpleDateFormat("yyyy-MM-dd");…

NuGet社区使用体验调查

Nuget 是我们使用.NET Core的一项基础设施,针对国内访问NuGet服务器速度不稳定的问题我们希望通过收集一些来自用户的反馈来改善社区使用NuGet的体验。恳请您花2-3分钟时间完成以下的问题,我们会非常重视您的反馈。当我们收集完成所有的问卷,…

在护卫神上部署javaWeb项目,已经测试通过

以前一直在护卫神上部署PHP项目,今天忽然来了需求是部署javaWeb项目,刚开始一脸蒙蔽,后来发现也不是很难。那么接下来我们看看怎么在护卫神上部署java项目: 第一步:打开护卫神,在护卫神中添加一个网站&…

为什么选择微服务架构?如何取舍?

转载自 为什么选择微服务架构?如何取舍? 微服务是什么 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成…

三星系统和鸿蒙系统,又一设备直升鸿蒙系统,现有操作系统被抛弃,和三星的想法一样!...

又一设备直升鸿蒙系统,现有操作系统被抛弃,和三星的想法一样!前段时间华为正式发布了鸿蒙系统,这个系统可以说是期待已久了,在华为处于禁令时期时,鸿蒙被认为是替代安卓的操作系统。在鸿蒙发布后&#xff0…

android之视频直播与播放Vitamio

直播APP l 直播原理 直播本质:实时推送/拉取过来的音视频数据 直播相关的协议: l RTMP(实时消息的传输协议) RTMP协议是一个互联网TCP/IP五层体系结构中的应用层协议 RTMP协议可以用来推送又可以用来直播 RTMP协议中基本的…

从真实项目中抠出来的设计模式——第一篇:策略模式

有时候因为种种原因导致我们会写出很多丑陋的代码,比如赶工时,短暂性的偷懒,不会设计模式等等导致代码沉积,一个cs上万行代码这样场景是有发生, 当然这里也包括我。。。所以时间充裕一点之后就想重构一下,…

jquery实现单击div切换背景,再次单击回到原来样式

首先来看看效果图: 1.这是默认的的div样式: 2.当我们单击第一个div时的样式: 3.当我们再次单击第一个div时的样式: 如果你需要的效果是这样的,那么请您继续往下面看,如果不是,您也可以看看实…

Java进阶之对象克隆(复制)

转载自 Java进阶之对象克隆(复制) 假如说你想复制一个简单变量。很简单: int apples 5; int pears apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但…

wxapkg的html反编译,wxapkg反编译工具包

软件简介 Soft IntroductionWechat App微信小程序反编译解包工具wxapkg及相关文件(.wxss,.json,.wxs,.wxml)还原工具。wxappUnpacker版本V0.3,当前功能如下(分包功能尚未完成!)将app-config.json中的内容拆分到各个文件对应的 .json和app.json , 并通过搜…

如何下载网页中的视频成mp4格式

1.在生活中,我们经常在网页上看到某个视频之后想要下载下来,可是,网上大部分的视频都在几大播放器所占领,比如爱奇艺、优酷、腾讯等等,当你在这些上面下载的时候会发现先要让你下载播放器,才能下载视频。这…

微软CNTK 2.0版本发布,支持C#

微软 CNTK 2.0 版本今天正式发布。 CNTK(Cognitive Toolkit)是微软的深度学习工具包,可以帮助企业加速图像和语音识别进程。有了今天的更新,企业可以在本地或云端结合 Azure GPU 使用 CNTK了。 伴随着今天的新版本发布&#xff0c…

Android碎片Fragment详讲(1)

Fragment Fragment创建的步骤 1、 继承fragment一定是V4包下的 2、 有且只有一个无参的构造方法 3、 如果Fragment需要显示界面,需要重写onCreateView方法 4、 指定布局资源,或者创建布局,返回即可 静态创建frag…

关于人脸和指纹识别共同交流方案

尊敬的各位朋友,各位粉丝: 非常感谢各位能从博客看到关于人脸识别的文章给我的评论以及点赞,也有好多粉丝从博客中直接加我的QQ,找我要js和jar包,我也大部分都给了。还有的找我要源码!!&#xf…

这些BATJ必考的Java面试题,你都懂了吗?

转载自 这些BATJ必考的Java面试题,你都懂了吗? 题目一 请对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别? 考点分析: 分析 Exception 和 Error 的区别,是从概念角度考察了…

计算机玩游戏特别卡,Win7电脑游戏卡顿怎么办 win7玩游戏卡如何解决

很多人都喜欢在win7系统中玩游戏,而在玩游戏的时候经常会碰到一些故障,比如有很多用户反映的游戏卡顿、玩游戏太卡,这让很多游戏玩家很是苦恼,那么Win7电脑游戏卡顿怎么办呢?下面给大家介绍一下win7玩游戏卡的解决方法…

在IIS上部署你的ASP.NET Core项目

概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中&a…

2020蓝桥杯省赛---java---A---2(既分数组)

题目描述 代码实现 package TEST;public class Main {public static void main(String[] args) {int ans 0;for(int i1; i<2020; i)for(int j1; j<2020; j) // if(j>i){{if(gcd(i, j) 1) ans;} // }else { // if(gcd(i, j) …