本文转载自:http://www.innomysql.net/article/23959.html
(只作转载, 不代表本站和博主同意文中观点或证实文中信息)

工作10余年,没有一个版本能像MySQL 5.7那样令我激动与期盼,10月MySQL 5.7 GA版本的发布,意味着MySQL数据库终于有能力在传统企业中向商业数据库发起挑战,开源的Linux操作系统干掉了封闭的Unix系统,MySQL会不会再一次逆袭商业产品?目前来看,或许很难,但是机会已经掌握在自己上手,后面的发展就看MySQL团队能不能把控住各种内在或外在的挑战了。然,不论怎么说,MySQL 5.7的原生JSON功能支持给非结构化数据存储的需求带来了崭新的、更优的选择。

首先来看维基百科对非结构化数据的定义:

Unstructured Data (or unstructured information) refers to information that either does not have a pre-defined data model or is not organized in a pre-defined manner.

非结构数据的特点就是没有预先定义好的数据模型,而传统关系型数据库的要求必然是定义好表结构,这就导致了传统关系型数据库在非结构化数据存储方面较为弱势的地位,从而给了其他NoSQL数据库机会。随着非结构化数据需求的快速发展,例如MongoDB这样的的文档型、非结构数据存储的数据库得到了极大的反战。

好在传统的关系型数据库厂商都意识到了这个问题,都在最新的版本中提供了对于非结构话数据存储功能的支持:

传统关系型数据库 支持JSON格式的版本
MySQL 5.7
Oracle 12.0.1
Microsoft SQL Server 2016
PostgreSQL 9.3

主流的关系型数据库都开始原生支持JSON格式,那么用户还需要MongoDB这类的NoSQL数据库吗?MongoDB是本人非常看好的数据库,从其将Oracle RAC之父(Founding Father for Oracle’s Real Application Clusters)Roger Bamford招致麾下[1][2],收购WiredTiger存储引擎来看,每次的选择都非常正确与果断,而其Replicate Set和Shard功能对于初级用户都显得那么平易近人,而其瞄准的云数据库市场也是正确的选择。然而,在传统关系型数据库开始推出JSON支持,推出官方shard功能之后,MongoDB的市场份额将不可避免的受到影响。Facebook已经使用MySQL数据库存储非结构数据了,随着时间的推移,相信将来这样的案例会越来越多,或许明年的OOW大会上可能就会看到。

JSON最早是用来在服务器和程序间进行数据交换的一种标准格式,相对于XML结构其可读性更强,占用空间更小,在REST架构下深受程序员们的欢迎。而MongoDB和CouchBase这样的文档数据库使用JSON来存储非结构化数据(半结构化数据),使得JSON在非结构化数据存储这方面成为了标准格式之一。
然而,每个关系型数据库对于JSON的底层支持也各不相同。MongoDB是通过BSON来进行存储数据,MySQL和PostgreSQL也类似,通过添加新的JSON存储方式来支持,这样的好处是在获取JSON对象的某字段时可以直接在底层得到,不需要在上层处理。而Oralce、SQL Server都是通过大对象类型,如LOB来存储JSON数据,借助于约束来进行JSON存储的有效性检查。

接着看一下如何在最新的MySQL数据库中使用原生的JSON格式:

1
2
3
4
CREATE TABLE UserJson(
 uid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
 data JSON
 );

使用就是这么简单,接着就允许以JSON格式插入非结构化数据,比如:

1
2
INSERT INTO UserJson(uid,data) VALUES (NULL,'{"name":"David",”address”:”Shanghai …”}');
INSERT INTO UserJson(uid,data) VALUES (NULL,'{"name":"Jim",”passport”:”E02318883”}');

在MongoDB中允许对非结构化数据中的某个字段创建索引,MySQL也完全可以做到,唯一不同的是首先需要创建一个新的虚拟列,然后对这个列进行索引的创建,对于上面的表UserJson要求name字段创建索引,可以按如下步骤进行:

1
2
3
ALTER TABLE UserJson ADD COLUMN name VARCHAR(128)
AS (json_unquote(json_extract(data,"$.name"))) VIRTUAL;
ALTER TABLE UserJson ADD INDEX idx_name (name);

MySQL 5.7对于JSON的支持是比较完整的,个人认为完全可以替换网易目前线上的MongoDB数据库,因为网易杭研有非常成熟的MySQL中间件的DDB,和MySQL 5.7配合使用,完全可以达到MongoDB的Replicate Set和Shard功能。所以,各位小伙们,还在等什么呢?

参考文献

  1. https://www.mongodb.com/press/roger-bamford-joins-mongodb-inc-distinguished-architect
  2. http://www.businessinsider.com/mongodb-poached-top-oracle-engineer-2014-7

MySQL 5.7:非结构化数据存储的新选择的更多相关文章

  1. spark 解析非结构化数据存储至hive的scala代码

    //提交代码包 // /usr/local/spark/bin$ spark-submit --class "getkv" /data/chun/sparktes.jar impo ...

  2. Python爬虫(九)_非结构化数据与结构化数据

    爬虫的一个重要步骤就是页面解析与数据提取.更多内容请参考:Python学习指南 页面解析与数据提取 实际上爬虫一共就四个主要步骤: 定(要知道你准备在哪个范围或者网站去搜索) 爬(将所有的网站的内容全 ...

  3. 结构化数据(structured),半结构化数据(semi-structured),非结构化数据(unstructured)

    概念 结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据. 半结构化数据:介于完全结构化数据(如关系型数据库.面向对象数据库中的数据)和完全无结构的数据(如声音.图像文件等)之 ...

  4. 结构化数据、半结构化数据、非结构化数据——Hadoop处理非结构化数据

    刚开始接触Hadoop ,指南中说Hadoop处理非结构化数据,学习数据库的时候,老师总提结构化数据,就是一张二维表,那非结构化数据是什么呢?难道是文本那样的文件?经过上网搜索,感觉这个帖子不错 网址 ...

  5. Spark如何与深度学习框架协作,处理非结构化数据

    随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...

  6. Scrapy系列教程(2)------Item(结构化数据存储结构)

    Items 爬取的主要目标就是从非结构性的数据源提取结构性数据,比如网页. Scrapy提供 Item 类来满足这种需求. Item 对象是种简单的容器.保存了爬取到得数据. 其提供了 类似于词典(d ...

  7. mysql命令行导入结构化数据

    数据样本 103252765-|--|-stephanie_mt@hotmail.com-|-o/35+nGaNEU=-|-ion|-- 其中|为分隔符,每行的换行符\n mysql -uroot M ...

  8. hbase非结构化数据库与结构化数据库比较

    目的:了解hbase与支持海量数据查询的特性以及实现方式 传统关系型数据库特点及局限 传统数据库事务性特别强,要求数据完整性及安全性,造成系统可用性以及伸缩性大打折扣.对于高并发的访问量,数据库性能不 ...

  9. 利用Gson和SharePreference存储结构化数据

    问题的导入 Android互联网产品通常会有很多的结构化数据需要保存,比如对于登录这个流程,通常会保存诸如username.profile_pic.access_token等等之类的数据,这些数据可以 ...

随机推荐

  1. npm不是以管理身份运行遇到的问题

    环境:win10+npm3.10.5 问题:在npm install lodash时,出现下列错误("npm-debug.log"文件内容) 0 info it worked if ...

  2. [CORS:跨域资源共享] W3C的CORS Specification

    随着Web开放的程度越来越高,通过浏览器跨域获取资源的需求已经变得非常普遍.在我看来,如果Web API不能针对浏览器提供跨域资源共享的能力,它甚至就不应该被称为Web API.从另一方面来看,浏览器 ...

  3. web应用中使用JavaMail发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...

  4. chrome使用技巧(看了定不让你失望)

    写在前面 之前有看过刘哇勇写的Chrome 控制台不完全指南,让我觉得瞬间对chrome的了解实在太浅了.对此特意了解了一番(也就是在他的博文上进行了一些总结和了解一些其它chrome使用方面的诀窍) ...

  5. SQL Server中的事务与锁

    了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁: ...

  6. ASP.NET MVC5 网站开发实践(二) Member区域 - 用户部分(1)用户注册

    上一次把基本框架搭建起来了,这次开始整Web部分,终于可以看到界面了小激动一下.web项目部分从用户功能开始,基本有注册,登录.注销.查找.查看.删除等涉及Member区域和Manage区域. 目录: ...

  7. Hibernate的数据删除,更改

    其他未给出代码,请参考上一篇.... 一.数据的删除 方法1.从“多”的一方进行数据的删除 books.hbm.xml文件不变: <many-to-one name="publishe ...

  8. jQuery.unique引发一个血案

    项目开发过程中,PM说系统只要在一个特定的浏览器中运行就好,但是在其他的浏览器中不能出现逻辑的错误,所以在开发过程中,前端和后台选择是Chrome浏览器,没有仔细测试Firefox和IE.但是昨天PM ...

  9. 确保 PHP 应用程序的安全

    开始之前在本教程中,您将学习如何在自己的 PHP Web 应用程序中添加安全性.本教程假设您至少有一年编写 PHP Web 应用程序的经验,所以这里不涉及 PHP 语言的基本知识(约定或语法).目标是 ...

  10. 如何用 js 获取table 或者其他块状标签的 宽和高

    这个比较简单,总体思想,标签标记一个id,js获取id,就能用它的属性了.介绍两种方法.请看下面代码. 第一种 <script> function width_table_all() { ...