ShardingSphere4.1.1数据分片不支持的SQL写法

  |   0 评论   |   0 浏览

  ShardingSphere强大之处就是在于客户端数据分片(分库分表),底层逻辑就是重写JDBC数据库驱动逻辑,将sql先解析,解析完再根据事先配置好的分表逻辑,进行路由,路由目前分DS数据源路由和table表路由,从而达到无侵入的分库分表查询,但是目前Sharding默认支持SQL92,sharding通过解析DataSource的url参数,来确定用什么sqlparser,我用的mysql数据库,因此sharding会采用mysql的sqlparser。但是这里的sqlpaser跟原生的mysql数据库执行逻辑不一样,经常sql执行的时候遇到问题,特别是子查询相关的,如果说从头开始就用Sharding来做底层数据库驱动,那相对来说稍微好点,如果是原数据库驱动改成sharding,则会遇到很多sql查询语句改造的问题,下面把官方开放出来的不支持的sql语句整理一下,以便后续回顾。

路由至多数据节点

不支持CASE WHEN、HAVING、UNION (ALL),有限支持子查询。
除了分页子查询的支持之外(详情请参考分页),也支持同等模式的子查询。无论嵌套多少层,ShardingSphere都可以解析至第一个包含数据表的子查询,一旦在下层嵌套中再次找到包含数据表的子查询将直接抛出解析异常。
例如,以下子查询可以支持:

SELECT COUNT(*) FROM (SELECT * FROM t_order o)

以下子查询不支持:

SELECT COUNT(*) FROM (SELECT * FROM t_order o WHERE o.id IN (SELECT id FROM t_order WHERE status = ?))

简单来说,通过子查询进行非功能需求,在大部分情况下是可以支持的。比如分页、统计总数等;而通过子查询实现业务查询当前并不能支持。
由于归并的限制,子查询中包含聚合函数目前无法支持。
不支持包含schema的SQL。因为ShardingSphere的理念是像使用一个数据源一样使用多数据源,因此对SQL的访问都是在同一个逻辑schema之上。

不支持的SQL

1598234423865610240.png
1598234467196964864.png


标题:ShardingSphere4.1.1数据分片不支持的SQL写法
作者:michael
地址:https://blog.junxworks.cn/articles/2021/09/28/1632814342905.html