公众号链接

最高级的红酒,一定要掺上雪碧才好喝。

基于这样的品味,我设计出了一套在经典nosql数据库redis上实现SQL引擎的方法。既然redis号称nosql,而我偏要把SQL加到redis上,于是这个技术方案取名为【YesSql】。

1.在redis上实现SQL查询的技术基础

  • redis上可以执行lua。整个SQL引擎就是在lua上解析SQL语句,执行,并返回结果。
  • lua有很好的正则表达式引擎,因此解析SQL语法变得简单。
  • redis提供map, zset这样的数据结构,很容易实现列存储
  • 关系数据库不也就是索引+遍历,核心逻辑完全能用lua来实现。

2.实现细节

2.1 create table

  • 假定我只支持number和string两种数据结构
  • 把整个按行组织的表看成由N个字段组成的列存储
    • 也就是说,字段的组织是: table_column -> map 或 zset
    • 用一个 table_rowid -> int 来产生一个rowid
    • map或者zset中的key使用rowid:
${table}_rowid -> int_value
${table}_${column1} -> map
${rowid1} -> column1 data of row 1
${rowid2} -> column1 data of row 2
${table}_${column2} -> map
${rowid1} -> column2 data of row 1
${rowid2} -> column2 data of row 2
  • 可以有唯一索引:
${table}_unique_index_1 -> map
${unique_key_1} -> rowid1
${unique_key_2} -> rowid
  • 可以有数值类型的排序索引:
${table}_number_index_1 -> zset
$rowid1 -> number1
$rowid2 -> number2
  • 所以:create table就是建立上面的KEY结构
  • 建表的语法大致如下:
create table my_first_redis_table_1(
column1 number,
column2 string,
column2 number
unique index column2,
number_index column3
)

2.2 insert

  • 插入时先要使用redis的INC指令得到一个新的rowid
  • 插入其实就是在${table}_${column}字段的下面增加二级KEY

2.3 update

  • update可以指定rowid或者唯一索引中的字段
  • 如果where条件比较复杂,则只能遍历字段,并最终取多个rowid集合的交集
  • set中的字段,先找到rowid,然后根据rowid更新就好了

2.3 delete

  • where条件中的搜索如同上面
  • 删除行就是逐个删除每个column key下面的rowid对应的二级KEY

2.4 select

这部分相对复杂,划分为不同的场景:

2.4.1 from部分

解析出表名是第一步的,然后就确定了KEY的前缀。

2.4.2 where条件

上面讲update和delete的where部分一笔带过了,具体有这样的一些场景:

  • 使用rowid=xxx或者rowid in ()的方式,比较简单
  • 使用unique_key=xxx或者unique_key in ()的方式,也比较简单,先通过唯一索引得到rowid,然后再根据rowid查询
  • 使用number_index的范围查询的情况,先使用ZRANGEBYSCORE找到多个rowid,然后再查询
  • 使用and/or/in及其其他字段上的表达式,无非也就是层层加过滤,知道最终确定rowid的集合

2.4.3 select部分

  • 每选择一个列,就意味着要输出这个列的值给查询方
  • 字段上的表达式,也比较容易实现

2.4.4 group by部分

  • 可以建立一个所有group by中字段名组合起来的临时KEY作为二级KEY的map
例如:
select column1, column2, count(1), sum(column3)
from table
group by column1, column2 可以建立这样的KEY结构:
temp_group_by_1 -> map
${column1_value}_${column2_value} -> rowid
temp_group_by_1_stat1 -> map
$rowid1 -> count_value
temp_group_by_1_stat2 -> map
$rowid1 -> sum_value

2.4.5 having部分

  • having部分,也就是在上一步汇总好的基础上,对rowid指向的值做过滤。
  • 还有一个优化点:如果没有having字句,汇总采用map结构;有having字句,采用zset结构,直接根据范围做过滤

2.4.6 join部分

不再叙述,猜测不会有那么无聊的人真的希望用上这么一套SQL引擎。

3.最后

  • 这是一个恶意的玩笑
  • 某种程度上可以作为一种思维训练,让我们知道SQL引擎可能是怎么去运行的

【一个idea】YesSql,一种在经典nosql数据库redis上实现SQL引擎的方案(我就要开历史的倒车)的更多相关文章

  1. SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis.

    SSDB 一个高性能的支持丰富数据结构的 NoSQL 数据库, 用于替代 Redis. 特性 替代 Redis 数据库, Redis 的 100 倍容量 LevelDB 网络支持, 使用 C/C++ ...

  2. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶

    一.八年双十一,造就国内最大最专业HBase技术团队 阿里巴巴集团早在2010开始研究并把HBase投入生产环境使用,从最初的淘宝历史交易记录,到蚂蚁安全风控数据存储.持续8年的投入,历经8年双十一锻 ...

  3. 一篇文章带你了解NoSql数据库——Redis简单入门

    一篇文章带你了解NoSql数据库--Redis简单入门 Redis是一个基于内存的key-value结构数据库 我们会利用其内存存储速度快,读写性能高的特点去完成企业中的一些热门数据的储存信息 在本篇 ...

  4. NoSQL 数据库概览及其与 SQL 语法的比较

    NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用的难题. 本文对NoSQL数据库的定义.分类.特征.当前比较流行的NoSQL数据库系统等进行了简单的介绍,并对N ...

  5. NoSQL数据库概览及其与SQL语法的比較

    [文章摘要] HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统.同一时候也是知名的NoSQL数据库之中的一个.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤 ...

  6. NoSql数据库Redis系列(1)——Redis简介

    一.redis介绍 (一).Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点 ...

  7. NoSQL最新现状和趋势:云NoSQL数据库将成重要增长引擎

    NoSQL最早起源于1998年,但从2009年开始,NoSQL真正开始逐渐兴起和发展.回望历史应该说NoSQL数据库的兴起,完全是十年来伴随互联网技术,大数据数据的兴起和发展,NoSQL在面临大数据场 ...

  8. jDialects:一个从Hibernate抽取的支持70多种数据库方言的原生SQL分页工具

    jDialects(https://git.oschina.net/drinkjava2/jdialects) 是一个收集了大多数已知数据库方言的Java小项目,通常可用来创建分页SQL和建表DDL语 ...

  9. NoSql数据库 设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 用户信息表,书籍信息表,用户为书籍打分信 ...

随机推荐

  1. MimeMessageHelper代码发邮件时,通过客服端登陆到邮箱,在已发送邮件里没有已经通过代码发送的邮件

    MimeMessageHelper代码发邮件时,通过客服端登陆到邮箱,在已发送邮件里没有已经通过代码发送的邮件, 这个问题很奇怪,这样的话不能看到通过代码发送的邮件历史记录,所以只好借助秘密抄送了,抄 ...

  2. 为dokcer中最简版ubuntu(70M)增加apt安装能力

    如果要在docker中安装软件,除了直接找对应的软件镜像,一般我们会先安装Linux系统,然后再在里面安装各种需要的软件. 比如我想安装乌班图,直接下载官方的版本: 这个目前是Ubuntu20.04, ...

  3. UDP&串口调试助手用法(5)

    note 提供安装包 基于win10开发 已通过win10测试,windows其他平台,没有测试 日志 2021-09-18 1.修复计算校验和错误的现象 2.屏蔽不计算校验和位置的REG验证(后期更 ...

  4. cmake以源码的方式引入第三方项目

    最前 本文将介绍一种以源码的方式引入第三方库的方法 准备 主项目,需要引用第三方库的某些函数 第三方库,以源码的形式提供给主项目使用 注意: 本文的背景:已经将第三方源码下载好. 一个例子 我这里准备 ...

  5. 【LeetCode】1019. Next Greater Node In Linked List 解题报告 (Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调递减栈 日期 题目地址:https://leetc ...

  6. Problem 2236 第十四个目标

    Problem 2236 第十四个目标 Accept: 4    Submit: 6Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem D ...

  7. STC8A,STC8G,STC8H系列的IRC内部振荡源频率调节

    从STC15开始, 宏晶就在内置RC震荡源(内置时脉, 宏晶称之为IRC)这条路上越走越远. STC15这一代仅仅是"有", 精度和漂移差强人意. 从STC8开始对IRC的调节就越 ...

  8. 剖析Defi之Uinswap_0

    Uniswap是什么,不需要讲了吧.YYDS(永远嘀神) 介绍几个概念: 恒定乘积算法:可以简单看作X * Y = K,这里K(乘积)保持不变,所以叫恒定乘积算法,该函数是一个反曲线. 自动流动性协议 ...

  9. HTML网页设计基础笔记 • 【第3章 表单】

    全部章节   >>>> 本章目录 3.1 表单 3.1.1 表单概述 3.1.1 表单概述(续) 3.1.2 表单标签 3.1.3 表单数据的提交方式 3.2 输入框和按钮 3 ...

  10. Windows10中同时安装MySQL5和MySQL8

    Windows10中同时安装MySQL5和MySQL8 同时安装的话,在执行mysql install要注意加名字,比如:mysqld --install MYSQL5 MySQL-5.5.54 ZI ...