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 sharding approaches?

问题:

什么是最好的MySQL分库分表方案?我想到的有:

  1. 应用层切分?
  2. MySQL代理层切分?
  3. 提供查找数据库分片的中心服务?

你们知道任何这方面有趣的项目或者工具吗?

回答:

最好的切分MySQL的方式就是:除非万不得已,否则不要去干它。

当你写一个应用时,你通常都想要最快的开发速度。只有必要时,你才开始优化延时,提高吞吐量,

你切分数据库的原因无非因为数据库的读或者写

  • 数据库写
    写操作永久的超过了服务器的磁盘负载;太多写入导致副本同步永远的落后了。
  • 数据库读
    读取到的数据量太大以至于称爆内存;并且大多数读操作开始直击磁盘而不是从内存中读取数据。

只有这时,你才需要考虑做数据库切分。

当你开始切分后,你开始以下面几种方式支付代价:

你的SQL语句不再是声明式的(declarative)

一般的,你用SQL语句告诉数据库你要什么数据,然后让优化器优化SQL,并将SQL转化成数据获取程序。
这很棒,因为它非常灵活,而且写这些转化程序很无聊,严重影响开发速度。

分布式环境下,你将A节点的表和B节点的表进行join,甚至有些表的数据大到超过一个节点,
在A节点和B节点将数据join起来,然后将B节点和C节点join后的数据再次聚合。
你开始写单方面的hash应用程序来解决这个问题(或者你可以再造MySQL的集群),
这表示结果你得到一大堆的非声明式的SQL,而且让程序以一种面向过程的方式开始工作

你招致了大量的网络延时

一般的,一条SQL查询语句可以本地解决并且通过优化器以最小的耗时解决这个查询问题。

在分布式环境下,查询语句必须要通过KV映射,访问多个网络节点(希望是批量访问,
而不是每个Key都来一次网络往返),或者将WHERE条件放在他们将被执行的节点上。

但是即使在最好的情况下,涉及到多个网络访问都会更加复杂。特别是MySQL的优化器完全不知道网络延时的情况。

你失去了SQL的许多强大能力

好吧,这或许没那么重要,但是外键约束,其他保证数据完整性的SQL机制,对于跨多个节点是无能为力的。

MySQL没有API保证异步查询返回顺序结果

当相同类型的数据存放在多个节点上(比如用户数据存放在A,B,C节点上),水平查询需要访问所有节点,
数据访问时间直接因以节点数线性增长。除非多个节点是以并行方式访问,然后再以Map-Reduce的方式聚合。

前提是需要提供异步通信的API,但这并不存在于MySQL提供的功能中。可选的方案是在子进程中增加很多的forking和连接。

总结

当你开始做数据库分库分表,数据结构和网络拓扑明显影响到应用的性能。 
为了运行良好,你的应用需要当心这些事情,所以只有应用层的切分才有意义。

如果需要自动切分,问题会更多(比如决定那个节点的那个列作为hash主键),或者
你想要手动进行切分,xyz用户去这个主库上,abc去和def去到那个主库上。

业务功能上的切分有些好处,如果做对了,这对绝大部分开发人员是透明的。因为所有相关的表都存放在本地。 
这让程序的透明性可以从声明式的SQL中尽量受益,并且有更少的网络延时,因为跨节点的网络访问被保持到最小化。

业务功能上的切分的缺点是:它不能准许单个表的数据膨胀过大,这需要设计者的特别注意。

业务功能切分的好处是:针对一个并没有太多改变的代码库,它相对而言非常简单。 
Booking.com在过去几年进行过几次业务功能上的分库分表,并且一直工作的很好。

转载于:https://www.cnblogs.com/405845829qq/p/7552750.html

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

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

相关文章

linux创建sudo用户_Linux终极指南-创建Sudo用户

linux创建sudo用户sudo stands for either "superuser do" or "switch user do", and sudo users can execute commands with root/administrative permissions, even malicious ones. Be careful who you grant sudo permissions to – you are quite lit…

重学TCP协议(1) TCP/IP 网络分层以及TCP协议概述

1. TCP/IP 网络分层 TCP/IP协议模型(Transmission Control Protocol/Internet Protocol),包含了一系列构成互联网基础的网络协议,是Internet的核心协议,通过20多年的发展已日渐成熟,并被广泛应用于局域网和…

分节符缩写p_p值的缩写是什么?

分节符缩写pp是概率吗? (Is p for probability?) Technically, p-value stands for probability value, but since all of statistics is all about dealing with probabilistic decision-making, that’s probably the least useful name we could give it.从技术…

Spring-----AOP-----事务

xml文件中&#xff1a; 手动处理事务&#xff1a; 设置数据源 <bean id"dataSource" class"com.mchange.v2.c3p0.ComboPooledDataSource"> <property name"driverClass" value"com.mysql.jdbc.Driver"></property…

[测试题]打地鼠

Description 小明听说打地鼠是一件很好玩的游戏&#xff0c;于是他也开始打地鼠。地鼠只有一只&#xff0c;而且一共有N个洞&#xff0c;编号为1到N排成一排&#xff0c;两边是墙壁&#xff0c;小明当然不可能百分百打到&#xff0c;因为他不知道地鼠在哪个洞。小明只能在白天打…

在PHP服务器上使用JavaScript进行缓慢的Loris攻击[及其预防措施!]

Forget the post for a minute, lets begin with what this title is about! This is a web security-based article which will get into the basics about how HTTP works. Well also look at a simple attack which exploits the way the HTTP protocol works.暂时忘掉这个帖…

三星为什么要卖芯片?手机干不过华为小米,半导体好挣钱!

据外媒DigiTimes报道&#xff0c;三星有意向其他手机厂商出售自家的Exynos芯片以扩大市场份额。知情人士透露&#xff0c;三星出售自家芯片旨在提高硅晶圆工厂的利用率&#xff0c;同时提高它们在全球手机处理器市场的份额&#xff0c;尤其是中端市场。 三星为什么要卖芯片&…

重学TCP协议(2) TCP 报文首部

1. TCP 报文首部 1.1 源端口和目标端口 每个TCP段都包含源端和目的端的端口号&#xff0c;用于寻找发端和收端应用进程。这两个值加上IP首部中的源端IP地址和目的端IP地址唯一确定一个TCP连接 端口号分类 熟知端口号&#xff08;well-known port&#xff09;已登记的端口&am…

linux:vim中全选复制

全选&#xff08;高亮显示&#xff09;&#xff1a;按esc后&#xff0c;然后ggvG或者ggVG 全部复制&#xff1a;按esc后&#xff0c;然后ggyG 全部删除&#xff1a;按esc后&#xff0c;然后dG 解析&#xff1a; gg&#xff1a;是让光标移到首行&#xff0c;在vim才有效&#xf…

机器学习 预测模型_使用机器学习模型预测心力衰竭的生存时间-第一部分

机器学习 预测模型数据科学 &#xff0c; 机器学习 (Data Science, Machine Learning) 前言 (Preface) Cardiovascular diseases are diseases of the heart and blood vessels and they typically include heart attacks, strokes, and heart failures [1]. According to the …

程序2:word count

本程序改变自&#xff1a;http://blog.csdn.net/zhixi1050/article/details/72718638 语言&#xff1a;C 编译环境&#xff1a;visual studio 2015 运行环境&#xff1a;Win10 做出修改的地方&#xff1a;在原码基础上修改了记录行数的功能&#xff0c;删去了不完整行数的记录&…

重学TCP协议(3) 端口号及MTU、MSS

1. 端口相关的命令 1.1 查看端口是否打开 使用 nc 和 telnet 这两个命令可以非常方便的查看到对方端口是否打开或者网络是否可达。如果对端端口没有打开&#xff0c;使用 telnet 和 nc 命令会出现 “Connection refused” 错误 1.2 查看监听端口的进程 使用 netstat sudo …

Diffie Hellman密钥交换

In short, the Diffie Hellman is a widely used technique for securely sending a symmetric encryption key to another party. Before proceeding, let’s discuss why we’d want to use something like the Diffie Hellman in the first place. When transmitting data o…

高效能程序猿的修炼

下载地址&#xff1a;http://download.csdn.net/detail/xiaole0313/8931785 高效能程序猿的修炼 《高效能程序猿的修炼是人民邮电出版社出版的图书。本书是coding horror博客中精华文章的集合。全书分为12章。涉及迈入职业门槛、高效能编程、应聘和招聘、团队协作、高效工作环境…

Spring 中的 LocalSessionFactoryBean和LocalContainerEntityManagerFactoryBean

Spring和Hibernate整合的时候我们经常会有如下的配置代码 1&#xff0c;非JPA支持的配置 <!-- 配置 Hibernate 的 SessionFactory 实例: 通过 Spring 提供的 LocalSessionFactoryBean 进行配置 --> <!-- FacotryBean 配置的时候返回的不是本身而是返回的FactoryBean 的…

如何通过建造餐厅来了解Scala差异

I understand that type variance is not fundamental to writing Scala code. Its been more or less a year since Ive been using Scala for my day-to-day job, and honestly, Ive never had to worry much about it. 我了解类型差异并不是编写Scala代码的基础。 自从我在日…

linux的/etc/passwd、/etc/shadow、/etc/group和/etc/gshadow

1./etc/passwd 存储用户信息 [rootoldboy ~]# head /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin 一行记录对应着一个用户&#xff0c;每行记录被冒号:分隔为7个字段&#xff0c;这7个字段的具体含…

组织在召唤:如何免费获取一个js.org的二级域名

之前我是使用wangduanduan.github.io作为我的博客地址&#xff0c;后来觉得麻烦&#xff0c;有把博客关了。最近有想去折腾折腾。先看效果&#xff1a;wdd.js.org 如果你不了解js.org可以看看我的这篇文章:一个值得所有前端开发者关注的网站js.org 前提 已经有了github pages的…

linkedin爬虫_您应该在LinkedIn上关注的8个人

linkedin爬虫Finding great mentors are hard to come by these days. With so much information and so many opinions flooding the internet, finding an authority in a specific field can be quite tough.这些天很难找到优秀的导师。 互联网上充斥着如此众多的信息和众多…

重学TCP协议(4) 三次握手

1. 三次握手 请求端&#xff08;通常称为客户&#xff09;发送一个 S Y N段指明客户打算连接的服务器的端口&#xff0c;以及初始序号。这个S Y N段为报文段1。服务器发回包含服务器的初始序号的 S Y N报文段&#xff08;报文段2&#xff09;作为应答。同时&#xff0c;将确认序…