编译原理之美
宫文学
北京原点代码 CEO
46197 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
编译原理 · 期中考试周 (1讲)
编译原理之美
15
15
1.0x
00:00/00:00
登录|注册

14 | 前端技术应用(一):如何透明地支持数据库分库分表?

透明访问多个数据库分片
提高数据库服务性能和可伸缩性
SQL规则文件与Java规则的比较
其他SQL解析场景
实际应用难度
Antlr工具应用
SQL解析需求
应用编译器前端技术
编译器前端技术应用
防注入措施
解析器速度
跨库操作分析
数据库元数据
语义分析
示例代码
Antlr工具
词法分析、语法分析、语义分析
跨库写入难题
跨库查询难题
数据库分片逻辑侵入业务逻辑
分库分表技术
数据量和访问量增加
一课一思
课程小结
SQL注入问题
实用性
解析SQL语句
挑战
分布式数据库需求
前端技术应用

该思维导图由 AI 生成,仅供参考

从今天开始,我们正式进入了应用篇,我会用两节课的时间,带你应用编译器的前端技术。这样,你会把学到的编译技术和应用领域更好地结合起来,学以致用,让技术发挥应有的价值。还能通过实践加深对原理的理解,形成一个良好的循环。
这节课,我们主要讨论,一个分布式数据库领域的需求。我会带你设计一个中间层,让应用逻辑不必关心数据库的物理分布。这样,无论把数据库拆成多少个分库,编程时都会像面对一个物理库似的没什么区别。
接下来,我们先了解一下分布式数据库的需求和带来的挑战。

分布式数据库解决了什么问题,又带来了哪些挑战

随着技术的进步,我们编写的应用所采集、处理的数据越来越多,处理的访问请求也越来越多。而单一数据库服务器的处理能力是有限的,当数据量和访问量超过一定级别以后,就要开始做分库分表的操作。比如,把一个数据库的大表拆成几张表,把一个库拆成几个库,把读和写的操作分离开等等。我们把这类技术统称为分布式数据库技术。
分库分表(Sharding)有时也翻译成“数据库分片”。分片可以依据各种不同的策略,比如我开发过一个与社区有关的应用系统,这个系统的很多业务逻辑都是围绕小区展开的。对于这样的系统,按照地理分布的维度来分片就很合适,因为每次对数据库的操作基本上只会涉及其中一个分库。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了利用编译技术解决数据库分库分表中的自动确定访问哪个分库的问题。随着数据量和访问量的增加,单一数据库服务器的处理能力变得有限,因此需要进行分库分表操作。文章指出了分布式数据库技术带来的挑战,如数据库分片逻辑侵入到业务逻辑中、跨库查询和跨库写入的难题等。为解决这些问题,文章提出了利用编译技术进行SQL语句解析的方法。通过示例展示了如何使用Antlr工具生成词法分析器和语法分析器,并通过visitor模式遍历AST来确定访问哪个分库。这一技术方案能够提高数据库服务的性能和可伸缩性,对于需要了解数据库分库分表技术及其应用的读者具有一定的参考价值。文章还提到了SQL注入攻击的危害以及利用编译器前端技术来做SQL解析的必要性。总的来说,本文通过实例和讲解,展示了编译技术在解决数据库分库分表问题中的应用,为读者提供了深入了解和应用该技术的参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编译原理之美》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • xiaoma2008
    如果老师对分布式数据库比较熟的话,希望老师能出个分布式查询的课程!

    作者回复: 我最近其实在构思写一个分布式数据访问的工具。跟MyCat的定位会不大相同,是想整体上把数据访问这件事情,对应用透明化。野心有点大。 因为现在很多用到数据库的应用,其水平扩展能力都困在了数据库这个点上。这个问题不解决,所谓云原生就是在忽视房间里的大象。 我看资料,已经有一些分布式数据库的商业产品。但要像使用一个单一的数据库一样的使用它,还是有点困难。 我整理一下这方面的思路,会跟大家分享的。

    2019-11-14
    3
    16
  • David
    关于编译技术还有什么经典的应用场景吗?老师帮我们拓展一下想象力。

    作者回复: 每个领域都会有这样的场景。 无论是上层的应用软件(如工资表软件),还是下层的基础软件(如数据库软件)。只要想让软件的功能有一定灵活性的、通用性的,都需要编译技术。 曾经在Lisp圈里(参见《黑客与画家》),有人说,每个软件做到极致的时候,里面都会包含一个拙劣的Lisp实现。他的意思是,每个软件做到极致,都要有灵活定制的能力,也就是需要编译技术的支持。 具体来说,每个领域不一样,所以举例子也只能举自己熟悉领域的例子。 我熟悉的领域: 1.企业软件:比如ERP软件等。定制能力是否强大,就是优秀的企业软件和平庸的企业软件的区别。现在的企业软件在实施的时候,成本往往很高,就是这方面比较差。我目前手头在做的一门语言,就是在解决这个领域的问题。 2.中间件/基础软件:这里肯定需要。例子太多了。 3.GIS,也算一种基础软件吧,也有编程能力。 其他同学,有的熟悉游戏领域,有的在AI领域,各自都有不同的场景。

    2019-10-01
    6
  • janey
    在编译器层面实现分布式数据查询,可以理解为把多表查询提前了吗?只是看起来就一个select语句

    作者回复: 你说的多表,是指同一个表在不同服务器上的分片吗? 如果一个SQL是涉及多个分片的,解析了SQL以后,是可以针对每个分片重新生成SQL的。但这个需要对语义更深的理解,要把SQL语句变成关系代数的运算(选择、投影、笛卡尔积、Union等),这样就知道如何正确的重组成多个SQL了。

    2019-09-17
    3
  • coconut
    老师,想要满足 高性能地解析SQL到语法树 这个需求,我尝试用antlr和yacc golang写了demo测试,antlr差不多性能降了300+倍,goyacc下降了10倍左右。 如果还想提高性能,还有什么方式么?我想到的 1.调研sql parser,如druid 2.尝试其他语言 (估计不会有啥提升)

    作者回复: 你能动手测量实际的性能,非常好!在有些应用场景中,SQL解析的性能确实很重要,因为它会叠加到每次服务请求的时间上,影响到系统响应的速度。 在《编译原理实战课》中,专门有讲MySQL的编译器的内容。你可以参考MySQL编译器的实现方法,简单概括一下它的特点: 1.词法分析器是手写的,这样会提供一定的灵活性。 2.语法分析器是用bison(yacc)实现的,你可以参考它的语法定义文件,看看跟自己做的定义文件的区别。mysql的例子证明,哪怕是生产级的产品,用工具来做语法分析仍然是可行的。 另外,在分析V8等编译器的时候,也提到了一些解析速度优化的方法,因为javascript需要解析后才能执行,解析速度慢就影响页面体验,所以采用了词法解析查字典等技术,把性能压榨到极致。

    2021-01-07
    2
  • Richie
    老师能不能多讲点,关于SQL解析的内容,更深,更细

    作者回复: SQL的部分展开确实挺多的。 要不然跟极客时间合作一本书,收集大家的需求,把一些细节更多的展开? 或者后面做课程升级的时候,考虑扩展一下这部分。

    2019-09-22
    2
  • 超越杨超越
    对老师讲的这部分还是没有太理解。 采用编译技术对SQL进行解析之后呢,结果是什么呢?遇到合法的SQL就执行,非法的SQL语句就直接报错么? 请问采用类似于正则匹配之类的方式,可以做到么?

    作者回复: 我再帮你理一下思路: 首先,你要理解本节课所提到的场景。在构建大型的系统的时候,经常需要把数据分片,也就是把逻辑上是同一个表的数据,物理上存放到不同的数据库服务器上。但是在编程的时候呢,又不想关心底层数据物理存储的细节,从而让业务逻辑与数据存储策略解耦。于是,就有一些中间件来完成这个任务。它们要能够读懂SQL语句,并把不同的SQL语句导向到不同的数据库服务器。 那怎么读懂SQL语句呢?这就需要编译技术的帮助了。首先,通过语法分析,把一个SQL语句变成结构化的AST,这样你就知道select子句、from子句、where子句等分别是什么,等等。接着,你再根据DSL中定义的规则,判断出该SQL应该发往哪个数据库服务器。 你说的正则匹配,也是可以的,不过正则文法的描述能力差一些。对于比较复杂的语句,正则文法是无能为力的。即使是用正则文法的方式,其实也一样是经历了一个解析过程,也就是编译过程。

    2020-11-10
    1
  • reverse
    注意;SQLite 的地址是 :https://github.com/antlr/grammars-v4/blob/master/sql/sqlite/SQLite.g4

    作者回复: 感谢分享!

    2020-03-27
    2
    1
  • zhj
    SQLVisitor代码在哪里了

    作者回复: https://github.com/RichardGong/PlayWithCompiler/blob/master/lab/db/src/main/playdb/SQLVisitor.java 我在文稿中加一下链接...

    2019-11-05
    1
  • Nick
    “作者回复: 我最近其实在构思写一个分布式数据访问的工具。跟MyCat的定位会不大相同,是想整体上把数据访问这件事情,对应用透明化。野心有点大。 因为现在很多用到数据库的应用,其水平扩展能力都困在了数据库这个点上。这个问题不解决,所谓云原生就是在忽视房间里的大象。 我看资料,已经有一些分布式数据库的商业产品。但要像使用一个单一的数据库一样的使用它,还是有点困难。 我整理一下这方面的思路,会跟大家分享的” 宫老师,我们很想听 您 关于 分布式数据访问工具 的分享。

    作者回复: 奥?我还挖过这样一个坑呀:-( 好吧,我确实关心这个方向,那我一定整理出一篇加餐来! 总体来说,数据库这个瓶颈,还有围绕数据库的计算模式,有点让人失望。我希望能见到革命性的创新出现,而不是现在的修修补补。

    2021-03-25
  • 冯选刚
    学到了。

    作者回复: Great! 希望应用篇能够帮大家把编译原理跟实际应用更好地结合起来!

    2020-01-23
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部