MySQL 5.7:非结构化数据存储的新选择
本文转载自: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功能。所以,各位小伙们,还在等什么呢?
参考文献
- https://www.mongodb.com/press/roger-bamford-joins-mongodb-inc-distinguished-architect
- http://www.businessinsider.com/mongodb-poached-top-oracle-engineer-2014-7
MySQL 5.7:非结构化数据存储的新选择的更多相关文章
- spark 解析非结构化数据存储至hive的scala代码
//提交代码包 // /usr/local/spark/bin$ spark-submit --class "getkv" /data/chun/sparktes.jar impo ...
- Python爬虫(九)_非结构化数据与结构化数据
爬虫的一个重要步骤就是页面解析与数据提取.更多内容请参考:Python学习指南 页面解析与数据提取 实际上爬虫一共就四个主要步骤: 定(要知道你准备在哪个范围或者网站去搜索) 爬(将所有的网站的内容全 ...
- 结构化数据(structured),半结构化数据(semi-structured),非结构化数据(unstructured)
概念 结构化数据:即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据. 半结构化数据:介于完全结构化数据(如关系型数据库.面向对象数据库中的数据)和完全无结构的数据(如声音.图像文件等)之 ...
- 结构化数据、半结构化数据、非结构化数据——Hadoop处理非结构化数据
刚开始接触Hadoop ,指南中说Hadoop处理非结构化数据,学习数据库的时候,老师总提结构化数据,就是一张二维表,那非结构化数据是什么呢?难道是文本那样的文件?经过上网搜索,感觉这个帖子不错 网址 ...
- Spark如何与深度学习框架协作,处理非结构化数据
随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...
- Scrapy系列教程(2)------Item(结构化数据存储结构)
Items 爬取的主要目标就是从非结构性的数据源提取结构性数据,比如网页. Scrapy提供 Item 类来满足这种需求. Item 对象是种简单的容器.保存了爬取到得数据. 其提供了 类似于词典(d ...
- mysql命令行导入结构化数据
数据样本 103252765-|--|-stephanie_mt@hotmail.com-|-o/35+nGaNEU=-|-ion|-- 其中|为分隔符,每行的换行符\n mysql -uroot M ...
- hbase非结构化数据库与结构化数据库比较
目的:了解hbase与支持海量数据查询的特性以及实现方式 传统关系型数据库特点及局限 传统数据库事务性特别强,要求数据完整性及安全性,造成系统可用性以及伸缩性大打折扣.对于高并发的访问量,数据库性能不 ...
- 利用Gson和SharePreference存储结构化数据
问题的导入 Android互联网产品通常会有很多的结构化数据需要保存,比如对于登录这个流程,通常会保存诸如username.profile_pic.access_token等等之类的数据,这些数据可以 ...
随机推荐
- Html5绘制时钟
最近在对Html5比较感兴趣,就用空闲时间做一些小例子进行练习,今天绘制一个走动的时钟,具体如下图所示: 具体思路在上图已有说明,代码如下: <script type="text/ja ...
- TDR分辨率
在日常的生活工作中,有很多测试测量的工具,比如测量长度的尺子,计量时间的钟表等等,谈到测试测量工具的时候,分辨率是关键指标之一,比如尺子的 分辨率是1mm,时钟的分辨率是秒.所谓分辨率就是测试测量工具 ...
- 面向对象设计之SRP(单一职责)原则
SRP设计原则面向对象类设计的第一个原则,最优先考虑的因素 一个类应该有且仅有一个职责.所谓一个类的职责是指引起该类变化的原因,如果一个类具有一个以上的职责,那么就会有多个不同的原因 引起该类变化,其 ...
- jQuery通过parent()和parents()方法访问父级元素
<div class="inputGroup"> <p>2.您的最高学历是?</p> <label><input type=& ...
- 【Win 10应用开发】Adaptive磁贴模板的XML文档结构
在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...
- Python下使用help(dict),显示'more'不是内部或外部命令,也不是可运行的程序或批处理文件,该如何处理?
1.首先需要用管理员身份运行cmd. 2.然后检查环境变量中path中是否添加C:\Windows\System32这个路径.
- 【商业源码】生日大放送-Newlife商业源码分享
今天是农历六月二十三,是@大石头的生日,记得每年生日都会有很劲爆的重量级源码送出,今天Newlife群和论坛又一次疯狂了,吃水不忘挖井人,好的东西肯定要拿到博客园分享.Newlife组件信息: 论坛: ...
- VXLAN 概念(Part I) - 每天5分钟玩转 OpenStack(108)
除了前面讨论的 local, flat, vlan 这几类网络,OpenStack 还支持 vxlan 和 gre 这两种 overlay network. overlay network 是指建立在 ...
- 教你如何塑造JavaScript牛逼形象
如何写JavaScript才能逼格更高呢?怎样才能组织JavaScript才能让别人一眼看出你不简单呢?是否很期待别人在看完你的代码之后感叹一句“原来还可以这样写”呢?下面列出一些在JavaScrip ...
- How to implement a neural network
神经网络的实践笔记 link: http://peterroelants.github.io/posts/neural_network_implementation_part01/ 1. 生成训练数据 ...