Mycat–理论–05–Mycat跨分片聚合处理机制
1、原理图
在内存中完成聚合逻辑,所以大量数据的情况下,资源消耗比较严重
2、分页
Select * from a limit 100
2.1、问题
存在随机结果集问题,比如分片1上的50条记录与分片2上的50条,取决于分片数据到来的先后顺序。
3、排序
3.1、算法
采用的是堆排序
3.2、分片表分页排序的复杂度问题
问题
取出从第100万开始的100条记录
Select * from a order by name limit 1000000,100
处理
需要改写为如下sql,发给每个分片去执行,然合排序,取出100条记录
Select * from a order by name limit 0,1000000+100
后果
如果每个分片都有200万数据,总共10个分片,那么就要处理200*10=2000万数据。导致sql执行非常耗时。
3.3、排序的优化算法1
-
保留当前排好序的最大100条记录作为结果集(topNSet),并记录当前结果集之前的记录总数(preCount)
-
如果一条记录符合当前结果集,则淘汰当前结果集中的一条记录,并且将preCount++
如果preCount++等于 100万 ,则处理结束,输出topNSet -
如果只有分页而不排序,则累计preCount,直到100万以后,在保存topNSet条记录输出即可
3.4、分页排序的优化可能性
假设:每个分片都是排序好的有序队列,对于以下sql
Select * from a order by name limit M,N
优化思路1
- 尽可能的放弃分片节点发来的无效数据
- 当满足以下条件时,就可以结束后继数据的处理了
所有分片都存在一个记录没有进入结果集的情况
优化思路2
- 多次向后端发起SQL请求
- 如果分片个数为Q个,则考虑获取M/Q+N条记录做排序
M为100万,总共10个分片,则每个分片获取10万+100条记录,
进入结果集排序,如果按照思路1的优化后,发现结果集数量不足,则继续发起后端请求
优化思路3
每个MySQL节点上Dump数据 ,然后分布式的排序和二进制高效传输