在内存中完成聚合逻辑,所以大量数据的情况下,资源消耗比较严重
2、分页Select * from a limit 1002.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条记录输出即可
假设:每个分片都是排序好的有序队列,对于以下sql
Select * from a order by name limit M,N优化思路1
- 尽可能的放弃分片节点发来的无效数据当满足以下条件时,就可以结束后继数据的处理了
所有分片都存在一个记录没有进入结果集的情况
- 多次向后端发起SQL请求如果分片个数为Q个,则考虑获取M/Q+N条记录做排序
M为100万,总共10个分片,则每个分片获取10万+100条记录, 进入结果集排序,如果按照思路1的优化后,发现结果集数量不足,则继续发起后端请求优化思路3
每个MySQL节点上Dump数据 ,然后分布式的排序和二进制高效传输4、分组,统计
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)