Sharding-JDBC改写自己查询规则思路

Posted starjuly

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sharding-JDBC改写自己查询规则思路相关的知识,希望对你有一定的参考价值。

问题

  • Sharding-JDBC一般是根据主键策略进行分片分表,在查询主键时根据路由规则能很快找到要查询的表,但是如果要查询的是其他字段呢,那么Sharding-JDBC就会将所有符合的表逐个查询,这样执行就会慢些。
  • 假如自己的某些字段是和主键一样,也是有规则的,那么也能不能直接找到合适的表,而不需要所有表做匹配呢?

核心代码

  • 有了这个问题,那么就调试,发现了的组装要执行sql的代码,方法路径如下:
org.apache.shardingsphere.core.BaseShardingEngine#rewriteAndConvert
  • 该方法代码如下:
    private Collection<RouteUnit> rewriteAndConvert(final String sql, final List<Object> parameters, final SQLRouteResult sqlRouteResult) 
        SQLRewriteContext sqlRewriteContext = new SQLRewriteContext(metaData.getRelationMetas(), sqlRouteResult.getSqlStatementContext(), sql, parameters);
        new ShardingSQLRewriteContextDecorator(shardingRule, sqlRouteResult).decorate(sqlRewriteContext);
        boolean isQueryWithCipherColumn = shardingProperties.<Boolean>getValue(ShardingPropertiesConstant.QUERY_WITH_CIPHER_COLUMN);
        new EncryptSQLRewriteContextDecorator(shardingRule.getEncryptRule(), isQueryWithCipherColumn).decorate(sqlRewriteContext);
        sqlRewriteContext.generateSQLTokens();
        Collection<RouteUnit> result = new LinkedHashSet<>();
        for (RoutingUnit each : sqlRouteResult.getRoutingResult().getRoutingUnits()) 
            ShardingSQLRewriteEngine sqlRewriteEngine = new ShardingSQLRewriteEngine(shardingRule, sqlRouteResult.getShardingConditions(), each);
            SQLRewriteResult sqlRewriteResult = sqlRewriteEngine.rewrite(sqlRewriteContext);
            result.add(new RouteUnit(each.getDataSourceName(), new SQLUnit(sqlRewriteResult.getSql(), sqlRewriteResult.getParameters())));
        
        return result;
    
  • 上边方法的参数中,sql是要我们执行的sql,parameters是这条sql要执行的参数。代码中会先根据要执行的sql生成所有匹配到表的sql,还有就是在for循环中就会添加所有合适规则的sql返回。
  • 也就是说可以根据传入的sql和参数,在for循环中找到合适自己要执行的sql,合适则执行result.add()方法,反之则不执行。

以上是关于Sharding-JDBC改写自己查询规则思路的主要内容,如果未能解决你的问题,请参考以下文章

sharding-jdbc分库分表规则-多表查询

sharding-jdbc分库分表规则-多表查询

sharding-jdbc分库分表规则-单表查询

sharding-jdbc分库分表规则-单表查询

mysql 查询优化 ~ 多表查询改写思路

sharding-jdbc绑定表的解析