注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Inside MySQL

MySQL MariaDB InnoDB InnoSQL

 
 
 

日志

 
 
关于我

MySQL技术内幕系列作者, 网易杭州研究院MySQL技术经理, 擅长于MySQL performance tuning、troubleshooting、systems availability and scalability、capacity planning

网易考拉推荐

通过MariaDB的dynamic column功能实现非结构化存储  

2013-08-21 17:08:58|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
MariaDB与MySQL的关系十分微妙,可以说本是同根生,相煎何太急。但通过这几年的发展,已经可以比较清晰的看出两者发展方向的不同。MariaDB由于Monty的存在,毫无疑问上层的开发能力优势明显。比如困扰社区多年的组提交,虽然Percona,Facebook都给出了解决方案,但最终还是MariaDB的方案胜出。MySQL由于之前Oracle早先已经收购InnoDB存储引擎,因此InnoDB存储引擎的开发具有绝对的发言权。上层与存储引擎的博弈,谁会胜出现在还很难说,但是MariaDB对于MySQL数据库本身做了很多的创新,其中dynamic column功能是我最为欣赏的。

由于MySQL数据库本身在进行ALTER TABLE时开销较大,需要锁表,因此若一张表在建立完成后,预料其还会增加列时,通常的做法是会预先定义很多的空列,待要增加列时,直接使用即可。但是,用户可能无法得知之后添加列类的类型,是INT,还是VARCHAR?例如在网游中,玩家用户有着无数的属性,这时应用通常会采用非结构化存储而非关系数据库的表,比如MongoDB等NoSQL系统。

MariaDB的dynamic column的优势是可以在MySQL存储非结构化的数据,从而达到schema free的效果。看看Monty自己对dynamic column的介绍:
  • Dynamic Columns has been in MariaDB for a while already. This feature allows you to store a different set of columns for every row in a table. In that manner Dynamic Columns can be called NoSQL-like.
使用dynamic column仅需将列定义为BLOB类型,之后非结构化的存储都存放在这个列中,看下面的例子:

create table assets ( item_name varchar(32) primary key, -- A common attribute for all items dynamic_cols blob -- Dynamic columns will be stored here );

接着可以插入非结构化的数据,如:

insert into assets 
values ('MariaDB T-shirt', COLUMN_CREATE('color', 'blue', 'size', 'XL'));
insert into assets values 
('Thinkpad Laptop', COLUMN_CREATE('color', 'black', 'price', 500));

可以发现第1条记录的dynamic column中存放的是color和size的属性,第2条记录存放的是color和price。这么简单就能在MySQL数据库中实现非结构化的存储!!!COLUM_CREATE是dynamic column的函数,其他函数还有COLUMN_ADD,COLUMN_GET,COLUMN_LIST等,具体可见MariaDB的官方用户手册。
此外,MariaDB还支持以json格式输出dynamic column中的内容,这对某些应用可以会非常有帮助:

MariaDB [test]>select item_name, COLUMN_JSON(dynamic_cols) from assets; +-----------------+----------------------------------------+ | item_name | COLUMN_JSON(dynamic_cols) | +-----------------+----------------------------------------+ | MariaDB T-shirt | {"size":"XL","color":"blue"} | | Thinkpad Laptop | {"color":"black","warranty":"3 years"} | +-----------------+----------------------------------------+ 2 rows in set (0.00 sec)

MariaDB 5.3就开始支持dynamic column,但是仅支持将数字作为列名。MariaDB 10.0.1开始可以使用数字或字符串作为列名,此外还增加了COLUMN_JSON和COLUMN_CHECK函数。这意味着更为直观与便捷的非结构化存储。真心期待MariaDB 10 GA版本的发布,或许世界会因此而有所不同。

——EOF——
PS: 欢迎关注InsideMySQL公众帐号
我眼中的flash cache - insidemysql - Inside MySQL

  评论这张
 
阅读(1843)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017