为什么MySQL将会是一个更好的NoSQL

转载自  为什么MySQL将会是一个更好的NoSQL

前言

MySQL是一个更好的NoSQL数据库。当考虑到NoSQL的使用案例,比如对Key/Value键值存储来讲,MySQL在性能、易用性和稳定性方面更有意义。MySQL毕竟是一款成熟稳定的产品,在互联网上有大量的在线教程,范围从操作到失败案例,从主从复制到其它不同模式的应用,不一而足。基于这个原因,MySQL相比其他新兴并没有经过多年洗礼的NoSQL来讲,确实有一定的优势。

近些年来,NoSQL慢慢成为了主流。许多开发者把这些NoSQL数据库,比如MongoDB、Cassandra、Redis或者Hadoop等,当作他们构建应用的数据库首选,而把老旧的传统数据库废弃不用。

选用NoSQL数据库,经常是建立在其不实或者夸大的宣传,和对传统关系型数据库性能不佳的假定上。开发者在选择数据库时,会特别看重操作成本,以及稳定性和成熟性。更多的不同NoSQL和关系型数据库的局限对比,可以参考Aphyr上Jepsen的一些列文章。

这篇文章会解释给大家为什么我们发现MySQL对于键值存储场景来说,比大多数专有NoSQL引擎还要好。另外,本文也会提供给大家在MySQL中此应用的参考。

归一化模型的问题

当用户点击一个链接到Wix网站时,他/她的浏览器会发送一个带有网站地址的HTTP请求给Wix的服务器。无论是自定义域名(比 如:domain.com)请求一个Wix的优质地址,还是一个在Wix域名下的免费的子域名(比如:user.wix.com/site),这个 HTTP请求都会发生。服务器不得不在网站地址中执行键值查询来处理用户对某个地址的请求。我们用路由来表示URL,进行下面的讨论。

路由表用于将站点地址解析为一个站点对象。因为站点可以暴露在多个路由中,所以是多对一的关系。一旦网站被发现,则应用将其加载以备使用。站点对象本身具有 复杂的结构,其中包涵两个子列表,列表中的对象表示了站点使用的不同服务。下面是一个对象的模型图,假设使用了标准SQL数据库和归一化模型:

 

当使用传统的归一化模型更新网站时,我们需要一个事务来更新多表,以确保保持数据一致性(注意,这里的事务使用的是数据库级别的锁来避免并发写,有些时候用 来避免在受影响的表中并发读)。继续使用这一模型,我们可能会有每张表的串行键、外键以及在路由表中对于URL列的索引。

然而,这里有几个使用归一化模型带来的问题:

  • 数据库锁限制了对表的访问,所以在高吞吐量的场景下,我们的性能可能会受一些影响

  • 读取对象涉及几个SQL查询(在本例中使用了4个)或联接——再次影响了延迟

  • 串行键施加锁和再次限制写入吞吐量

这些问题相当于限制了我们使用MySQL(或者其它任何SQL引擎)时的吞吐量和并发。因为这些短板,外加事实上我们需要的是键值存储,所以许多开发者倾向于使用NoSQL作为解决方案以提供更高的吞吐和更多的并发,甚至是更好的稳定性、一致性和高可用。

MySQL来作为引擎的优势

在Wix,我们发现,当我们“有创造性的”使用MySQL作为键值存储时,能够提供比上面提到的使用归一化数据模型或者其它大多数NoSQL数据库引擎更好的性能。简单的使用MySQL来作为NoSQL引擎,我们现有的系统,无论是在伸缩性、吞吐量、并发和延迟指数上,相较NoSQL都具有令人惊艳的性能。 下面列举一些数据:

  • 横跨三个数据中心的异地多活

  • 吞吐量在200,000RPM的数量级

  • 路由表记录在100,000,000的数量级,10GB的存储

  • 站点表记录在100,000,000的数量级,200GB的存储

  • 读延迟平均在1.0-1.5毫秒(事实上,在一个数据中心,延迟为0.2-03毫秒)

值得注意的是,对于绝大多数的键值引擎,无论是开源数据库还是云数据库,1.0毫秒的延迟被认为是相当令人惊讶的水平。然而我们用MySQL就实现了这一壮举(考虑到还使用了基本的SQL引擎)

这是我们实际使用的模型:

 

 

任何未被当做查询条件的字段,都被放置在一个单一的blob字段(上面的site_data字段)。其中包含子对象表,和其他表本身的字段。另外注意,我们 并未使用串行键,相反的,我们使用了一个varchar(50)的字段,用于存储客户端生成的GUID值。

下面是我们使用的一个查询,具备高吞吐的同时,还具备了低延迟:

 

工作原理是这样的,首先使用唯一索引在路由表上执行查询,应该尽的到一条记录。接着使用这条记录的主键,在站点表执行查询,返回的记录也是一条。

嵌套的查询语法可以确保这两个 SQL查询仅在数据库记录中查询一次。

上面的结果显示,平均延迟在1毫秒以下,并且在高流量和高更新率的情况下能保证一致性。虽然没有使用事务,但是update却是半事务的。因为我们在一条插入语句中输入了完整的网站地址,直到进入路由表,这条记录才会被发现。

所以如果我们首先输入了站点网址,然后是路由,我们就能确保有一个一致性的状态,即使是在最边缘的情况下,我们也仅仅是在站点表中有一些“孤儿”数据。

使用从上面例子(或者在Wix的其它案例)中的到的经验,我们简要的列举出了一个使用MySQL当做NoSQL引擎使用的参考。

当使用MySQL当做NoSQL引擎使用时,首先要记住的一点是避免使用数据库级别的锁或者是复杂查询:

  • 不要使用事务,因为事务引入了锁。相反的,使用应用来控制事务

  • 不要使用串行键。串行键引入了锁和其它敷在的启动配置

  • 使用客户端生成唯一键,我们使用了GUID

当为优化读设计模型时,鞋面是额外的一些经验仅供参考:

  • 不使用归一化模型

  • 所有的字段在被索引时才有必要存在。如果字段在查询时不需要,则将其放到一个blob/text字段中(如JSON或者XML)

  • 不要使用外键

  • 设计你的模型,来确保查询时仅读取单独的一行

  • 不要在表上使用alter命令。修改表的命令引入了锁和停机时间,相反的,尝试使用实时迁移

当查询时:

  • 使用主键或者索引查询记录

  • 避免使用表连接

  • 避免使用聚合函数

  • 尽量在从库上执行较为复杂的查询(如BI,数据研究等),避免在master数据库上执行上述操作

总结

最值得在这篇文章中看到的是如何打破思维尝试不同的思考。使用MySQL来当做NoSQL引擎,看起来是不错的,虽然MySQL最开始并不是为此而设计的。 本文中演示的,是一个使用MySQL而不是NoSQL引擎来构建键值访问。在Wix,MySQL是我们的键值存储场景的选择是因为操作简单、使用简单,并且MySQL本身有极好的生态。此外,MySQL还能提供额外的低延迟、高吞吐和数据一致性保证。

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

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

相关文章

气泡提示效果css.html,用纯CSS3绘制高端简约的气泡提示框

用纯css绘制一个简单的气泡提示框,对于长期关注课课家CSS3绘图教程的朋友来说是件轻而易举的事,但是程序员最不喜欢做的事情是重复造轮子,加上之前小编分享的几个气泡要么过于复杂,通用性不强,要么需要鼠标移上才显示&…

HTML5表格简单应用案例之[招聘需求表]

首先先来看一下实现的效果&#xff1a; 源代码&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style type"text/css">#tab{width: 100%;}tr td{width: 10%;height: 50px;t…

我为什么鼓励工程师写blog

工程师该怎样才能突破自己能力瓶颈&#xff1f;写 blog&#xff01;工程师该怎样精进自己在职涯上所需要的能力&#xff1f;写 blog&#xff01;工程师该怎样才能保持学习与成长的动能&#xff1f;写 blog&#xff01;工程师该怎样才能证明自己的潜力与特质&#xff1f;写 blog…

2020蓝桥杯省赛---java---C---1(约数个数)

题目描述 代码实现 package TEST;class Main{public static void main(String[] args) {int ans0;for (int i 1; i < 78120; i) {if(78120%i0){ans;}}System.out.println(ans);} }答案 96

关于docker的15个小tip,你都知道吗

转载自 关于docker的15个小tip&#xff0c;你都知道吗 Tip1 获取最近运行容器的id 这是我们经常会用到的一个操作&#xff0c;按照官方示例&#xff0c;你可以这样做&#xff08;环境ubuntu&#xff09;&#xff1a; $ ID$(docker run ubuntu echo hello world) hello worl…

CSS3中引入多种自定义字体(font-face)

今天在HTML中发现了一个问题&#xff0c;提供给我们默认的字体有很多&#xff0c;但是除了那些“黑体”、“宋体”、“楷体”等支持中文字体之外&#xff0c;其余的都不知道中文字体&#xff0c;如果我们需要用自己喜欢的字体怎么办呢&#xff1f;CSS3中是否可以引入自定义下载…

html5 block调用html,HTML: blockquote 标签

HTML: 标签HTML 标签在HTML文档中从另一个来源定义了长块引用。传统上&#xff0c;浏览器将在 标签中找到的文本呈现为缩进文本。该标签通常也称为 元素。在线示例定义一个摘自另一个源的块引用&#xff1a;示例html>HTML5 blockquote by www.nhooo.comHeading 1这是将出现在…

android之微信分享音频

android之微信分享音频 代码&#xff1a; WXMusicObject muObj new WXMusicObject(); muObj.musicUrl "http://music.baidu.com/song/546920050?pstsug"; WXMediaMessage msg new WXMediaMessage(); msg.mediaObject muObj; msg.title "越过山丘";…

在ASP.NET Core中使用Apworks快速开发数据服务

不少关注我博客的朋友都知道我在2009年左右开发过一个名为Apworks的企业级应用程序开发框架&#xff0c;旨在为分布式企业系统软件开发提供面向领域驱动&#xff08;DDD&#xff09;的框架级别的解决方案&#xff0c;并对多种系统架构风格提供支持。这个框架的开发和维护我坚持…

2015蓝桥杯省赛---java---A---1(熊怪吃核桃)

题目描述 代码实现 package TEST; class Main{public static void main(String[] args) {int n1543;int sum0;while (n!1){if(n%20){n/2;}else {sum;n--;}}System.out.println(sum1);} }答案 5

多功能语音播放器上线啦~

应广大学生反映&#xff0c;学程序不会读单词&#xff0c;留言问我能不能做个语音播放器&#xff0c;就是能输入英文能读出来的那种&#xff01;&#xff01;为了帮助公众号里面仅有的几百粉丝&#xff0c;我就顺手写一个吧&#xff0c;万一还能增加点粉丝呢&#xff1f;于是经…

Redis进阶之主从复制

转载自 Redis进阶之主从复制 一、主从复制概述 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认…

html图片通过照片查看器打开图片,在Windows7中打开照片,提示“Windows 照片查看器无法显示此图片,因为计算机上...

在Windows7中打开照片&#xff0c;提示“Windows 照片查看器无法显示此图片&#xff0c;因为计算机上的可用内存可能不足。请关闭一些目前没有使用的程序或者释放部分硬盘空间(如果硬盘几乎已满)&#xff0c;然后重试。” 如下图所示&#xff1a;处理过程&#xff1a;1、查看计…

android微信分享之视频、URL地址、表情分享

android微信分享之视频、URL地址、表情分享 1、视频分享 1、创建WXVideoObject对象&#xff0c;用于指向视频URLWXVideoObject videoObject new WXVideoObject(); // 2、设置视频urlvideoObject.videoUrl "http://v.youku.com/v_show/id_XMzI0MzA3NjI1Ng.html?…

2015蓝桥杯省赛---java---A---3(九数分三组)

题目描述 代码实现 package TEST;class Main{public static void main(String[] args) {for (int i 100; i < 335; i) {if(check(i)){System.out.println(i);}}}public static boolean check(int n){String an""n*2n*3;if(a.contains("1")&&a…

EntityFramework Core不得不注意的性能优化意外收获,你会用错?

前言 这两天在着实研究EF Core项目当中对于一些查询也没实际去检测&#xff0c;于是想着利用放假时间去实际测试下&#xff0c;结果本文就出来了&#xff0c;too young,too simple&#xff0c;后续博主会从底层翻译表达式树弄起&#xff0c;来从源头了解EF Core&#xff0c;通…

微服务为什么离不开spring cloud?

转载自 微服务为什么离不开spring cloud? 现如今微服务架构十分流行&#xff0c;而采用微服务构建系统也会带来更清晰的业务划分和可扩展性。同时&#xff0c;支持微服务的技术栈也是多种多样的&#xff0c;本系列文章主要介绍这些技术中的翘楚——Spring Cloud。这是序篇&a…

html画等边三角形,前台面试:使用CSS画一个等边三角形

CSS是前台面试必考的内容&#xff0c;有时候会面试官会出题让你画少量基本图形。由于画图的过程中可以考察很多的CSS知识点。今天我们就和大家详情一个比较难得等边三角形。思路是利使用三个div的边框来拼成一个三角形&#xff0c;只要要调整好左右两个div边框的旋转角度&#…

CSS3美化网页元素

一、CSS的作用&#xff1a; 1.有效的传递页面信息。 2.使用CSS美化过的页面&#xff0c;使得页面更加漂亮&#xff0c;吸引用户。 3.可以很好的突出页面的主题内容。 4.具有良好的用户体验。 二、span标签的作用&#xff1a; 自己本身在网页中不起作用&#xff0c;但是可以让某…

2017蓝桥杯省赛---java---A---1(迷宫)

题目描述 X星球的一处迷宫游乐场建在某个小山坡上。 它是由10x10相互连通的小房间组成的。房间的地板上写着一个很大的字母。 我们假设玩家是面朝上坡的方向站立&#xff0c;则&#xff1a; L表示走到左边的房间&#xff0c; R表示走到右边的房间&#xff0c; U表示走到上坡方…