DEAD MAN CODING

FOOOLING.COM

分布式关系型数据库中的group by和order by

Aug. 16, 2014, 12:57 a.m.

今天使用TDDL5,做一个查询的时候,遇到了使用临时表的问题。

我当时使用了诸如

SELECT xxx 
FROM table 
WHERE xxxxxx
GROUP BY A
ORDER BY B  

的语法,服务器报了一个SQL错误,告诉我不能创建临时表,除非指定。

于是突然想起了梦实多次答疑提到的这个问题。

其实,在分布式的场景下,一个group by的执行会被TDDL5的优化器转换成 order by  在各个分表中下发查询。

这是为什么呢?

这就不得不考虑到这个聚合如何在分布式场景下执行了。

每个分表查询的数据取出后需要做一个group by的话,通常分段有序是最高效的,这个看看复杂度就懂了。。

于是转换成了order by后,再group by,就相当于执行了 order by A , group by A 。 这时结果是对A有序的。

这时如果再要对B有序,就麻烦了。。我们的做法是,建立一个临时表再来order by。呵呵。这是需要消耗资源的。但也是可以做的,TDDL可以通过SQL的Hint来开启这个功能。

所以,一般情况下,group by 和 order by 不要指定一个以上的字段,如果数据量较小,聚合的操作也推荐在本地做,而不是用临时表的方式。

友情链接