https://v.youku.com/v_show/id_XNDQ3OTc2MzkyNA==.html
前几期我们介绍了 Global 表和 ER 表,除此之外 DBLE 还提供了 hint 来指定路由的功能。
什么是 Hint
我们先介绍一下 hint,hint 是一种有效注释,将业务应用指定一个分库,实现中间件可以用指定的方式去下发 SQL。基本上是这样的,hint 里面是有一个路由的结果,比如我这里面 ID=1。通过拆分算法求模,我知道 ID=1 会下发给哪个库,但是真正的执行的 SQL 是另外一种 SQL,这里面这个 SQL 也不是很好,但是能表达功能。通过 hint 来计算路由,然后计算好路由以后下发的是另外一条我想下发的语句。
我们举一个例子。
比如说 insert xx select * from xxx 现在 DBLE 是不支持的,但是我们可以通过 hint 这种方式来实现。所以 hint 目的就是指定路由结果,但实际执行的是 SQL 的内容。
Hint 的分类
DBLE 的 hint 一共分这几种(如图),一个是通过 SQL 来计算路由。一个是直接指明了我要下发的节点。第三种和我们之前说的有点不一样,就是在读写分离中,我强制要求我的 select 强制走主节点,也可以通过 hint 这种方式来指定的。
操作演示
https://v.youku.com/v_show/id_XNDQ3OTc5NTI4OA==.html
我们用 hint 演示存储过程这样一个例子。我们还是通过 MySQL 的 DBLE 应用端入口。我们去看一下 tb_mod 这张表,看到有 5 行数据,比如说现在场景是我想删掉某一个节点上的数据。当然你可以通过写 SQL 的方式来,但是我们这个例子主要展现一个能力:我的某个存储过程在某个节点上建立以后我怎么去用 hint 调用它。
过程就很简单,其实就是 delete * from tb_mod 。但是它前面有一个有一个 hint 操作,指到 tb_mod=1这里。然后我执行一下这个存储过程 call 命令。执行成功后,1 和 5 这两条数据已经被删掉了。这样我们可以通过指定某个节点执行一些我们没办法在 DBLE 层面上做的事情,作为我们普通的一个 DBLE 支持的语法的扩展。类似 insert select * from table 等等语句都可以通过这种方式来执行。
好,我们今天先介绍到这里。
图文稿为了方便阅读,在不影响学习的情况下优化了一些口语化词汇,文稿与视频会尽量保持一致。