Logo
排序

排序 #

原理 #

DBPlusEngine 排序功能依赖于数据库底层的排序功能,当用户输入一条包含 ORDER BY 的 SQL 时,DBPlusEngine 会将逻辑 SQL 路由到对应的存储数据源上,并将逻辑 SQL 改写为真实 SQL。由于真实 SQL 中同样包含了 ORDER BY 语句,返回的结果集自身也是有序的,因此 DBPlusEngine 在对多个数据源的结果进行归并时,利用每个结果集的有序性,通过维护一个有序队列来实现全局的有序。

建议 #

  1. 合理地设置 max-connections-size-per-query 参数,保证 DBPlusEngine 在执行时能够为每个分片结果集分配至少一个连接持有结果集,避免将流式结果集转换为内存结果集占用过多内存;具体可参考连接模式

示例 #

以如下 t_score 表查询为例,逻辑 SQL 中按照 score 字段排序,返回的各个分片的结果集按照 score 倒序排序。将 3 个数据结果集的当前游标指向的数据值进行排序,并放入优先级队列,t_score_0 的第一个数据值最大,t_score_2 的第一个数据值次之,t_score_1 的第一个数据值最小,因此优先级队列根据 t_score_0,t_score_2 和 t_score_1 的方式排序队列。

排序 1

下图则展现了进行 next 调用的时候,DBPlusEngine 排序是如何进行的。通过图中我们可以看到,当进行第一次 next 调用时,排在队列首位的 t_score_0 将会被弹出队列,并且将当前游标指向的数据值(也就是 100)返回至查询客户端,并且将游标下移一位之后,重新放入优先级队列。而优先级队列也会根据 t_score_0 的当前数据结果集指向游标的数据值(这里是 90)进行排序,根据当前数值,t_score_0 排列在队列的最后一位。 之前队列中排名第二的 t_score_2 的数据结果集则自动排在了队列首位。

排序 2

可以看到,对于每个数据结果集中的数据有序,而多数据结果集整体无序的情况下,DBPlusEngine 无需将所有的数据都加载至内存即可排序。 它使用的是流式归并的方式,每次 next 仅获取唯一正确的一条数据,极大的节省了内存的消耗。