如果使用得当,MySQL 也可以化身 NoSQL
【编者按】随着互联网和移动互联网的发展,各个机构都需要支撑远超过以往的数据。而在这个需求的刺激下,IT 领域出现了大量数据处理技术,其中之一就是 NoSQL 。灵活的数据类型,高效的处理能力,让 NoSQL 已占据数据管理系统的一席之地,比如人气 NoSQL 数据库 MongoDB。然而在 Wix 工程实践中,他们发现,大量场景中其实并不需 要 NoSQL,反而成熟的 RDBMS 更具效益,比如 MySQL。下面一起看 Wix 工程主管 Aviran Mordo 的分享,本文系 OneAPM 工程师翻译。
开发人员选择 NoSQL 数据库一般都是根据主观臆断,或者“关系型数据库性能不如 NoSQL 数据库”这个错误的理念。此外,在做数据库选型时,开发人员往往还忽视了运维上的开销。实际上根据 Wix 的实践发现,大部分情况下都不必去选择 NoSQL 数据库,而且如果使用得当的话,MySQL 也可以是一个优秀的 NoSQL 数据库。
在可扩展系统构建时,一个很重要的考量是使用的技术是否成熟,选择成熟的技术意味着出错时能够迅速恢复。当然,开发者也可以在项目中使用最新最牛的 NoSQL 数据库,而这个数据库在理论上也可以良好地运行,然而在生产环境中出现了问题恢复需要多久?技术上已有的知识和经验积累对于问题缓解至关重要,当然这个积累也包括了 Google 可以搜索到的内容。相比之下,关系型数据库已经存在了超过四十年,业界对于关系型数据库的维护也积累了大量的经验。基于这些考虑,在新项目做技术选型时通常会选择 MySQL,而不是 NoSQL 数据库,除非 NoSQL 真的有非常非常明显的优势,比如数据量太大就不适合使用 MySQL。
必须承认 MySQL 也有自己的问题。在大规模系统中使用的话可能会碰到性能上的问题。为实现 MySQL 性能的最优化,这里总结了几条经验,其中之一是避免数据库级别的事务。因为事务需要数据库采用锁来实现,从而会影响数据库性能。通常情况下会使用逻辑应用程序级的锁来 替换,从而减少负载并获得一个更好的性能。
举个例子,以发票结构为例。如果某个发票有多个行项目,取代在单事务将所有行项目写入,这里更应该在非事务情况下逐行写入。在所有行全部写入数据库后,这里还会写入一个首记录,它包含了指向所有行项目 ID 的指针。这样一来,如果所有行中有一行写入失败,那么这行的首记录就会不存在,从而整个事务失败。这么做虽然可能会造成一些垃圾记录,但在存储介质如此便宜的今天这显然不是什么大问题,而这些垃圾记录也可以做定期删除。
下面也中介了一些 MySQL 实践经验:
不要使用 joins 查询,只做主键或者索引查询。
不要使用自增主键因为会有锁,取而代之,使用客户端生成键,比如 GUIDs。同时,如果你使用主主备份,自增键还可能会冲突,因此你需要为每个实例都定制键的范围。
没有索引的字段通通删掉或者使用 JSON 集合成单一字段。
在 Wix,MySQL 经常会被当做键值存储,比如在一列中储存 JSON 对象,从而在不改变数据库模式下对数据结构模式进行扩展。在 MySQL 中,使用主键读取也很快,Wix 就通过这个方式获得了亚毫秒级的读取速度,完全可以支撑整个使用场景。基于以上这些原因,MySQL 完全可以看作一个符合 ACID 原则的 NoSQL 数据库。至于数据库的大小,一个 MySQL 实例支持几亿条数据是没什么问题的。
关系型数据库的一个鲜明的优势是不用考虑最终一致性,而这个在 NoSQL 数据库中并不是原生支持的。本文也不是贬低 NoSQL,因为关系型数据库已有限制也非常多:严格的数据结构和大小限制。这里只是想提醒开发人员,在选择新技术时不要忽视运维成本。
原文链接:MySQL is a Great NoSQL Database
OneAPM 是应用性能管理领域的新兴领军企业,能帮助企业用户和开发者轻松实现:缓慢的程序代码和 SQL 语句的实时抓取。想阅读更多技术文章,请访问 OneAPM 官方博客。
如果使用得当,MySQL 也可以化身 NoSQL的更多相关文章
- mySQL、mariaDB、noSQL、SQL server、redis之间是什么关系?
1.首先,从数据库类型上分类,mySQL.mariaDB.SQL server这3种属于关系型数据库. noSQL属于非关系型数据库,被视为数据库革命者. redis成为内存缓存数据库,而前面的两种类 ...
- MySQL与NoSQL——SQL与NoSQL的融合
来源:http://www.cnblogs.com/sunli/archive/2011/05/11/mysql-nosql.html 写这一篇内容的原因是MySQL5.6.2突然推出了memcach ...
- HandlerSocket ---MySQL与NoSQL ---SQL与NoSQL的融合(转)
项目地址:https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL 写这一篇内容的原因是MySQL5.6.2突然推出了memcached的功能 ...
- SQL vs NoSQL 没有硝烟的战争!
声明:本文译自SQL vs NoSQL The Differences,如需转载请注明出处. SQL(结构化查询语言)数据库作为一个主要的数据存储机制已经超过40个年头了.随着web应用和像MySQL ...
- 【转】MySQL 高可用架构在业务层面的分析研究
原文地址 http://database.51cto.com/art/201507/483463_all.htm 前言: 相对于传统行业的相对服务时间9x9x6或者9x12x5,因为互联网电子商务以及 ...
- 分布式mysql中间件(mycat)
1. MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上.这时集中式数据库系统表现出它的不足: (1)集中 ...
- Mycat对MySQL进行垂直水平分表分库,读写分离
1. MyCAT概述 1.1 背景 随着传统的数据库技术日趋成熟.计算机网络技术的飞速发展和应用范围的扩充,数据库应用已经普遍建立于计算机网络之上.这时集中式数据库系统表现出它的不足: (1)集中 ...
- 为什么使用Nosql:Nosql和SQL的区别
1.概念: SQL(Structured Query Language)数据库,指关系型数据库.主要代表:SQL Server.Oracle.MySQL.PostgreSQL. NoSQL(Not O ...
- NoSQL是什么?
导读 NoSQL(not only sql,不仅仅是SQL),是一项全新的数据库革命性运动,泛指非关系型数据库,对于NoSQL这个新兴的名词,每个人的理解都不同.其实NoSQL一词最早出现于1998年 ...
随机推荐
- 深入探析koa之异步回调处理篇
在上一篇中我们梳理了koa当中中间件的洋葱模型执行原理,并实现了一个可以让洋葱模型自动跑起来的流程管理函数.这一篇,我们再来研究一下koa当中异步回调同步化写法的原理,同样的,我们也会实现一个管理函数 ...
- 胸腺嘧啶“T”
4.下列物质或结构中含胸腺嘧啶“T”的是( )A.DNA聚合酶 B.烟草花叶病毒C.ATP D.B淋巴细胞中的线粒体
- 巧用Excel分列功能处理数据
Technorati 标签: 数据处理 今天,主要工作就是处理测试数据,统计汇总成图表来显示.先来说说要求,然后给出我在折腾这堆数据中遇到的问题以及解决方法. 问题要求: 格 ...
- sql简易的MRP资源分析
写了个简易的MRP根据传进来的数据,进行上下级的判断,父表,子表 构思: 3张变量表,第一张用来存传进来的成品,这边对表做了循环就是成品是一样一样进去的,取成品表的第一行,将数据做父表和子表关联,取出 ...
- 转:关于Apache与Nginx的优势比较(经典)
不断有人跟我说Nginx比Apache好.比Apache快之类.Nginx更主要是作为反向代理,而非Web服务器使用.我翻译过一本关于反向代理的技术书籍,同时精通Apache API开发,对Nginx ...
- winform:无法引用其他类库,dll,using等个人看法【图】
在项目类库中已经引用了相关了类库,生成解决方案也没问题,但是到了后置代码,通过using引用其他类库的时候,再生成解决方案或者生成单个类库,就会报“未能找到类型或命名空间“xxx"(是否缺少 ...
- 封装getElementsByClassName
function getElementsByClassName(oEle,sClass,sEle){ if(oEle.getElementsByClassName){ return oEle.getE ...
- Berkeley DB
最近用BDB写点东西,写了挺多个测试工程.列下表,也理清楚最近的思路 1.测试BDB程序,包括打开增加记录,查询记录,获取所有记录.将数据转存mysql 程序的不足,增加记录仅仅只有key和value ...
- 你必须知道的.NET
作者博客地址:http://www.cnblogs.com/anytao/archive/2008/04/09/anytao_insidenet_center.html 第1章 OO大智慧 1.1对象 ...
- js数组的splice方法
w3school文章链接:http://www.w3school.com.cn/jsref/jsref_splice.asp splice:拼接,结合. splice()方法向数组添加/删除元素,返回 ...