Group By和Order By一起使用的问题
又是那个百万级数据的数据库表……原本使用分组后查询语句正常运行,现在新的需求要求每个分组的数据显示最新一条,未加Order By之前的查询语句如下,每个分组数据会默认取第一条
SELECT * FROM table1 WHERE columnX = xxx GROUP BY column_1
因Order By无法使用在Group By之前,使用在Group By之后只能实现分组后的数据排序,不符合需求,故需要套用子查询,改为
SELECT * FROM ( SELECT * FROM table1 WHERE columnX = xxx ORDER BY create_time DESC) GROUP BY column_1
然而,Order By并未生效!Group By 比Order By先执行,Order By不会对Group By内部进行排序,如果Group By后只有一条记录,那么Order By将无效。
的写法,在Order By之后加入LIMIT,鉴于是百万级别数据,直接LIMIT 10000000一千万,然后生效确实生效了,但是相关博客都没有考虑过这个问题,查询时间直接起飞了,本身百万数据在条件语句查询之后返回时间就在2-3秒左右,一个Limit下去,查询时间直接奔着20秒去了……
SELECT * FROM ( SELECT * FROM table1 WHERE columnX = xxx ORDER BY create_time DESC LIMIT 10000000) GROUP BY column_1
针对这种情况,只有将sql改为(针对百万数据,查询速度约达到5-6秒):
SELECT * , MAX(create_time)FROM table1 WHERE columnX = xxx GROUP BY column_1
结果集中可以看到MAX(create_time)和create_time的区别,但是这种情况下,虽然返回了最新一条数据的时间,但是数据本身对应的仍是第一条而不是最新一条,只能选择性显示不变的字段,暂时没有更好的办法。
经研讨,此处最好的解决办法依然是分表,参照table1的结构做一个最新数据表table2出来,插入数据时同时插入table1和table2,只不过table1存储全量数据,table2存储最新数据,即,table2删除现有的column_1下数据再插入新的一条,这样保证每个column_1只对应一条最新数据。查询将分为针对table2的全量查询,和针对table1具体column_1的查询。这样在插入每条数据的时候多了一个删除和插入的操作,但是极大地提高了查询的性能。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341