MySQL 5.7:非结构化数据存储的新选择

时间:2021-12-30 22:59:31
本文转载自: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. 简单的MySQL数据库主从同步配置

    Master配置: 代码如下 复制代码 log-bin = mysql-binserver-id = 1binlog-do-db = powerdns #要同步的数据库 Master新增slave账号 ...

  2. Shadow Register 是什么?

    ARM处理器有个Shadow Register的概念,查了很多资料,语焉不详,究竟是什么意思呢? 这其实是个和硬件有关的概念. 有些register是2层的,第一层是供CPU访问,第二层供Hw访问. ...

  3. 3、Data对象

    1.创建part1.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  4. webpack的多文件打包问题

    1.第三方库如vue,vue-router可以利用webpack中的entry指定vendor:['vue','vue-router']来打包在一个文件中 2.将这些文件单独提取出来,在页面中使用&l ...

  5. vue 脚手架 立即可以写业务 vue &plus; vue-router &plus; less &plus; axios &plus; elementUI &plus; moment

    https://github.com/cynthiawupore/wq-cli

  6. python学习笔记(七)- 递归、python内置函数、random模块

    1.函数的不固定参数: #参数不是必填的.没有限制参数的个数.返回参数组的元组 def syz(*args): #参数组,不限制参数个数 #‘args’参数的名字可以随便命名 print(args) ...

  7. Spring集成mybatis时mybatis的映射XML配置

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  8. 【BZOJ5290】 &lbrack;Hnoi2018&rsqb;道路

    BZOJ5290 [Hnoi2018]道路 前言 这道题目我竟然没有在去年省选切? 我太菜了. Solution 对题面进行一个语文透彻解析,发现这是一个二叉树,乡村都是叶子节点,城市都有两个儿子.( ...

  9. Eclipse删除switch workspace下多余的workspace

    第一步:修改org.eclipse.ui.ide.prefs 文件 打开Eclipse目录的\configuration\.settings目录,找到org.eclipse.ui.ide.prefs ...

  10. Django学习之天气调查实例(2):显示数据表数据

    数据表数据添加后,如添加3条用户信息,分别为“aaa”.“bbb”.“ccc”,现在通过代码的方式显示数据表中的数据. 1.在website项目文件夹中创建 userload.py文件,并且写如下代码 ...