美文网首页
sharding-jdbc归并排序

sharding-jdbc归并排序

作者: Britney_z | 来源:发表于2021-12-02 11:10 被阅读0次

    看看官方归并文档:https://shardingsphere.apache.org/document/legacy/4.x/document/cn/features/sharding/principle/merge/

    我就拿order by o.user_id desc 举例子,看看源码的实现流程

    SELECT o.* FROM t_order_0 o JOIN t_order_item_0 i ON o.order_id=i.order_id and o.user_id IN    (    ? , ?,?,? ,?   ) order by o.user_id desc 

    我们选择的合并方式是OrderByStreamMergedResult

    OrderByStreamMergedResult维护着结果集数组 List<QueryResult> queryResults

    循环遍历结果集数组,将每个结果集数组第一条数据orderByValue加入orderByValuesQueue队列

    我们看看orderByValue.next()方法

    OrderByValue对象维护orderValues数组,因为我们按照order by o.user_id来排序, 取出user_id的值,放入orderValues数组中。

    重写了compareTo方法,比较orderValues的值

    PriorityQueue  orderByValuesQueue队列排序好

    PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator(比较器)在队列实例化的时排序。要求使用Java Comparable和Comparator接口给对象排序,并且在排序时会按照优先级处理其中的元素。

    设置QueryResultcurrent    orderByValuesQueue的第一个queryResult

    现在开始取数据了,我们看看OrderByStreamMergedResultnext方法,弹出最大对应的OrderByValue

    取出下一个元素, queryResult.next(),如果存在,重新设置,重新加入orderByValuesQueue进行排序,排序完之后设置当前为第一个queryResult。

    怎么从queryResult取值我就不讲了。

    相关文章

      网友评论

          本文标题:sharding-jdbc归并排序

          本文链接:https://www.haomeiwen.com/subject/dllyxrtx.html