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

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版本的发布,或许世界会因此而有所不同。

发表评论

坐等沙发
相关文章
MySQL 8.0 200W QPS!!!InnoDB大重构 #M1005#
MySQL 8.0 200W QPS!!!InnoDB大重构 …
滚蛋吧,MySQL主从复制延迟
滚蛋吧,MySQL主从复制延迟
MySQL 8.0.3性能大杀器 —— CATS
MySQL 8.0.3性能大杀器 —— CATS
2017年MySQL数据库技术嘉年华 —— 有态度的技术大会
2017年MySQL数据库技术嘉年华 —— 有态度…
IMG社区MySQL技术沙龙南京站圆满结束
IMG社区MySQL技术沙龙南京站圆满结束
改朝换代:MySQL Group Replication
改朝换代:MySQL Group Replication
myadmin 订阅者
我还没有学会写个人说明!

一触即发,2017年,数据库世界的诸神之战