14 | 前端技术应用(一):如何透明地支持数据库分库分表?
该思维导图由 AI 生成,仅供参考
分布式数据库解决了什么问题,又带来了哪些挑战
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了利用编译技术解决数据库分库分表中的自动确定访问哪个分库的问题。随着数据量和访问量的增加,单一数据库服务器的处理能力变得有限,因此需要进行分库分表操作。文章指出了分布式数据库技术带来的挑战,如数据库分片逻辑侵入到业务逻辑中、跨库查询和跨库写入的难题等。为解决这些问题,文章提出了利用编译技术进行SQL语句解析的方法。通过示例展示了如何使用Antlr工具生成词法分析器和语法分析器,并通过visitor模式遍历AST来确定访问哪个分库。这一技术方案能够提高数据库服务的性能和可伸缩性,对于需要了解数据库分库分表技术及其应用的读者具有一定的参考价值。文章还提到了SQL注入攻击的危害以及利用编译器前端技术来做SQL解析的必要性。总的来说,本文通过实例和讲解,展示了编译技术在解决数据库分库分表问题中的应用,为读者提供了深入了解和应用该技术的参考。
《编译原理之美》,新⼈⾸单¥59
全部留言(18)
- 最新
- 精选
- xiaoma2008如果老师对分布式数据库比较熟的话,希望老师能出个分布式查询的课程!
作者回复: 我最近其实在构思写一个分布式数据访问的工具。跟MyCat的定位会不大相同,是想整体上把数据访问这件事情,对应用透明化。野心有点大。 因为现在很多用到数据库的应用,其水平扩展能力都困在了数据库这个点上。这个问题不解决,所谓云原生就是在忽视房间里的大象。 我看资料,已经有一些分布式数据库的商业产品。但要像使用一个单一的数据库一样的使用它,还是有点困难。 我整理一下这方面的思路,会跟大家分享的。
2019-11-14316 - David关于编译技术还有什么经典的应用场景吗?老师帮我们拓展一下想象力。
作者回复: 每个领域都会有这样的场景。 无论是上层的应用软件(如工资表软件),还是下层的基础软件(如数据库软件)。只要想让软件的功能有一定灵活性的、通用性的,都需要编译技术。 曾经在Lisp圈里(参见《黑客与画家》),有人说,每个软件做到极致的时候,里面都会包含一个拙劣的Lisp实现。他的意思是,每个软件做到极致,都要有灵活定制的能力,也就是需要编译技术的支持。 具体来说,每个领域不一样,所以举例子也只能举自己熟悉领域的例子。 我熟悉的领域: 1.企业软件:比如ERP软件等。定制能力是否强大,就是优秀的企业软件和平庸的企业软件的区别。现在的企业软件在实施的时候,成本往往很高,就是这方面比较差。我目前手头在做的一门语言,就是在解决这个领域的问题。 2.中间件/基础软件:这里肯定需要。例子太多了。 3.GIS,也算一种基础软件吧,也有编程能力。 其他同学,有的熟悉游戏领域,有的在AI领域,各自都有不同的场景。
2019-10-016 - janey在编译器层面实现分布式数据查询,可以理解为把多表查询提前了吗?只是看起来就一个select语句
作者回复: 你说的多表,是指同一个表在不同服务器上的分片吗? 如果一个SQL是涉及多个分片的,解析了SQL以后,是可以针对每个分片重新生成SQL的。但这个需要对语义更深的理解,要把SQL语句变成关系代数的运算(选择、投影、笛卡尔积、Union等),这样就知道如何正确的重组成多个SQL了。
2019-09-173 - 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-072 - Richie老师能不能多讲点,关于SQL解析的内容,更深,更细
作者回复: SQL的部分展开确实挺多的。 要不然跟极客时间合作一本书,收集大家的需求,把一些细节更多的展开? 或者后面做课程升级的时候,考虑扩展一下这部分。
2019-09-222 - 超越杨超越对老师讲的这部分还是没有太理解。 采用编译技术对SQL进行解析之后呢,结果是什么呢?遇到合法的SQL就执行,非法的SQL语句就直接报错么? 请问采用类似于正则匹配之类的方式,可以做到么?
作者回复: 我再帮你理一下思路: 首先,你要理解本节课所提到的场景。在构建大型的系统的时候,经常需要把数据分片,也就是把逻辑上是同一个表的数据,物理上存放到不同的数据库服务器上。但是在编程的时候呢,又不想关心底层数据物理存储的细节,从而让业务逻辑与数据存储策略解耦。于是,就有一些中间件来完成这个任务。它们要能够读懂SQL语句,并把不同的SQL语句导向到不同的数据库服务器。 那怎么读懂SQL语句呢?这就需要编译技术的帮助了。首先,通过语法分析,把一个SQL语句变成结构化的AST,这样你就知道select子句、from子句、where子句等分别是什么,等等。接着,你再根据DSL中定义的规则,判断出该SQL应该发往哪个数据库服务器。 你说的正则匹配,也是可以的,不过正则文法的描述能力差一些。对于比较复杂的语句,正则文法是无能为力的。即使是用正则文法的方式,其实也一样是经历了一个解析过程,也就是编译过程。
2020-11-101 - reverse注意;SQLite 的地址是 :https://github.com/antlr/grammars-v4/blob/master/sql/sqlite/SQLite.g4
作者回复: 感谢分享!
2020-03-2721 - zhjSQLVisitor代码在哪里了
作者回复: https://github.com/RichardGong/PlayWithCompiler/blob/master/lab/db/src/main/playdb/SQLVisitor.java 我在文稿中加一下链接...
2019-11-051 - Nick“作者回复: 我最近其实在构思写一个分布式数据访问的工具。跟MyCat的定位会不大相同,是想整体上把数据访问这件事情,对应用透明化。野心有点大。 因为现在很多用到数据库的应用,其水平扩展能力都困在了数据库这个点上。这个问题不解决,所谓云原生就是在忽视房间里的大象。 我看资料,已经有一些分布式数据库的商业产品。但要像使用一个单一的数据库一样的使用它,还是有点困难。 我整理一下这方面的思路,会跟大家分享的” 宫老师,我们很想听 您 关于 分布式数据访问工具 的分享。
作者回复: 奥?我还挖过这样一个坑呀:-( 好吧,我确实关心这个方向,那我一定整理出一篇加餐来! 总体来说,数据库这个瓶颈,还有围绕数据库的计算模式,有点让人失望。我希望能见到革命性的创新出现,而不是现在的修修补补。
2021-03-25 - 冯选刚学到了。
作者回复: Great! 希望应用篇能够帮大家把编译原理跟实际应用更好地结合起来!
2020-01-23