日常吐槽

国外文章也不是都是好文章啊,不要见到英文就觉得高大上了……

前言

越来越多的关系型数据库底层选择基于KV构建,例如TiDB的TiKV(RocksDB),cockroach的levelDB,MySQL的tokudb,以及被苹果墙掉的FoundationDB。本文抢救出一篇FoundationDB的参考文章。

苹果买下FoundationDB后,FoundationDB的所有公开数据均被删除,包括Github,pypi,twitter等。

本文包含如下内容:

如何将关系型数据库的数据存入KV数据库

能否直接用KV数据库的接口读取数据

能否对KV数据库直接写数据,并用SQL读出修改后的数据

CockroachDB是如何做的

TiDB是如何做的

如何将关系型数据库的数据存入KV数据库

简单来说,FoundationDB的SQL层将数据库的元数据(metadata)作为键,将对应的数据作为值存入KV数据库。数据库表的有三种序列化方式,默认是foundationDB的tuple方式,当然,也可以选择使用protobuf序列化,或者使用column_keys的格式进行序列化,本文也只介绍foundationDB原生的序列化tuple序列化方式。

KV数据库中的键是有序排列的,所有的库、表、列甚至索引对应的元数据由对应的目录层在KV数据库中存储成类似etcd中的“目录结构”的形式。目录层对数据库中的每个库、表、列生成对应的二进制字符串,该字符串在将关系型的数据映射到KV数据库时作为区分库、表、列的前缀。同时,目录层还可以将表的元数据转换到该二进制前缀。

如下实例解释文中提到的目录层如何工作。

CREATE TABLE schema_a.table_name_1(id INT PRIMARY KEY, c CHAR(10));

CREATE TABLE schema_a.table_name_2(id INT PRIMARY KEY);

默认有一个根目录,目录名叫sql,包含所有SQL层用到的所有键,下层目录叫做data,用于区数据和元数据。再下层目录叫做table,用于区分表内容和序列数据(sequence data)。table目录中的所有下一级的目录均为逻辑库(schema)的目录,逻辑库的下一级目录为逻辑表(table)的目录。

Directory

Tuple

Raw Key

sql /

(9)

x15x09

sql / data /

(3)

x15x03

sql / data / table /

(31)

x15x1F

sql / data / table / schema_a /

(228)

x15xE4

sql / data / table / schema_a / table_name_1 /

(215)

x15xD7

sql / data / table / schema_a / table_name_2 /

(247)

x15xF7

当使用tuple序列化方式时,一行的数据被存储为一个键值对,键由上面提到的目录的“二进制前缀”,table在Table-Group中的位置和主键组成,值便是由这条记录所有的列的进行序列化后的值。

例如:对上面两张表插入几条数据,对应的SQL和对应的键值对如下:

INSERT INTO schema_a.table_name_1 VALUES (1, 'hello'), (2, 'world');

INSERT INTO schema_a.table_name_2 VALUES (5);

二进制键

tuple形式的键

二进制值

tuple形式表示的值

x15xD7x15x01x15x01

(215, 1, 1)

x15x01x02hellox00

(1, ‘hello’)

x15xD7x15x01x15x02

(215, 1, 2)

x15x02x02worldx00

(2, ‘world’)

x15xF7x15x01x15x05

(247, 1, 5)

x15x05

(5)

能否直接用KV数据库的接口读取数据

简单回答:能。

能否对KV数据库直接写数据,并用SQL读出修改后的数据

安全性上来说,不能。FoundationDB数据不仅仅包含数据层,修改目录层的数据,很容易就会导致系统异常,例如缺少索引,缺少约束,缺少数据可元信息的验证。

CockroachDB是如何做的

CockroachDB中每个表都必须有主键,如果没有的话,默认也要生成一个。和FoundationDB一样,所有的表都会被映射为KV数据库中的键前缀。

每一列或者列族(column family)在KV数据库中,都会被序列化成一个值,并且作为KV数据库中的后缀。

例如:

在mydb下面创建表customers,包含两个列,一个列是name,一个列是URL,cockroach会在数据库中存储如下的schema信息:

Key

Values

/system/databases/mydb/id

51

/system/tables/customer/id

42

/system/desc/51/42/address

69

/system/desc/51/42/url

66

数据库mydb的id是51,表customer的id是42,列address的id是69,列url的id是66。

和FoundationDB不通,cockroachDB中一个键值对存储的是一条记录中某一列的值。

Key

Values

/51/42/Apple/69

1 Infinite Loop, Cupertino, CA

前缀/51/42,表示mydb库的customer表,/Apple表示主键值为Apple,/66和/69表示对应的列。

TiDB是如何做的

TiDB没有给出具体的方案,但是给出了一个大概的方案:

INSERT INTO user VALUES (1, "bob", "huang@pingcap.com");

INSERT INTO user VALUES (2, "tom", "tom@pingcap.com");

键存储的是表名+索引,值存储的是该条记录所有列的内容。

总结

RDBMS映射到KV比较简单,基本为:

KV中的键:唯一ID,通常能定位到一条记录,或者一条记录中的一个字段。但是,通常会映射、压缩。

KV中的值:对应序列化后的一条记录,或者一条记录中的一个字段。

另外,KV数据库中不仅仅存储着表的内容,还会存储着优化后的索引等许多东西。

mysql做kv数据库_如何将SQL数据映射到KV数据库相关推荐

  1. azure云数据库_如何使用SQL Data Sync同步Azure SQL数据库和本地数据库

    azure云数据库 SQL Data Sync allows you to synchronize data across multiple Azure SQL databases and on-pr ...

  2. 使用FoundationDB高效地将SQL数据映射到NoSQL存储系统中

    NoSQL数据库 --FoundationDB的键-值存储系统 FoundationDB是一个分布式的键-值存储系统,支持全局ACID事务操作,并且性能出众.在安装系统时,可以指定数据分发的级别.数据 ...

  3. mysql select 所有表_怎样用SQL语句查询一个数据库中的所有表

    展开全部 查询32313133353236313431303231363533e59b9ee7ad9431333431356639一个数据库中的所有表sql语句是show tables: 显示所有数据 ...

  4. mysql 客户无感知迁移_亿级账户数据迁移,不用数据库工具还能怎么搞?

    原标题:亿级账户数据迁移,不用数据库工具还能怎么搞? 背景 在阿里巴巴内部"大中台,小前台"的组织和业务体制,使前线业务更加敏捷,赋能业务积极迎接未来挑战和机遇,在阿里大中台能力建 ...

  5. azure云数据库_在Azure SQL数据库中保护数据的五种方法

    azure云数据库 When storing data in the cloud the main concern companies generally have is whether or not ...

  6. sql 不同数据库同步数据_什么是SQL数据同步

    sql 不同数据库同步数据 SQL Data Sync is a service that allows synchronizing data across multiple Azure SQL da ...

  7. mysql 对象名无效_如何解决“SQL对象名无效”的问题

    展开全部 java中连接数据32313133353236313431303231363533e4b893e5b19e31333433653939库,数据库连接字符串不是可以指定数据库名么,指定了应该就 ...

  8. sql还原数据库备份数据库_如何获取SQL数据库还原历史记录

    sql还原数据库备份数据库 This article will review how to get information on your SQL database restore history, ...

  9. azure云数据库_使用Azure SQL数据库构建ASP.NET应用

    azure云数据库 In this article, you will learn about Azure SQL Database and its uses. Then the article sp ...

最新文章

  1. Python | [a for b in c for a in b]的用法
  2. default.html
  3. 洛谷P4239 【模板】多项式求逆(加强版)(多项式求逆)
  4. SaltStack源码分析之:master端执行salt模块大致流程
  5. tf2: Gradients do not exist for variables when minimizing the loss.
  6. Express + TypeScript开发微信应用
  7. STM32:RS485通信和Modbus通信协议汇总
  8. 随便说说Silverlight
  9. Java下载文件,中文文件名乱码问题解决
  10. linux rz sz使用
  11. 使用golang链接达梦数据库
  12. 2022快手春节跳一跳红包到 怎么获得66元红包?
  13. 火灾报警设计multisim仿真
  14. H5 css引入方式 内联样式表
  15. 建设智慧园区的八大优势
  16. python实现:读取PDF文件中的英文单词,并将前二十个高频词储存到一个docx文档中
  17. 实战操作——一次简单的逆向分析破解锁机软件
  18. Linux编写内核模块,实现在/proc目录下添加文件
  19. No module named curses
  20. Kubernetes之Ingress

热门文章

  1. 菲尔兹奖得主丘成桐院士:数学之美与应用
  2. CentOS6 使用 RPM 安装 apache 服务器(一)
  3. python 需求分析
  4. Spring之AOP系列--将方法上的注解做为切点(用@Around)
  5. 量化分析入门2:上证指数走势图及移动平均线
  6. nand falsh 111
  7. [FJOI2016]建筑师
  8. android 仿微信demo————注册功能完善添加头像功能(服务端)
  9. 如何在Linux上部署web程序
  10. [转]kaldi ASR: DNN训练