10
回答
千万数据量排序后,分页展示,怎么快速响应

数据库表的记录在千万级别,需求就是,根据页面的过滤条件,过滤出数据,然后根据不同的排序规则,排序后,分页展示

 

SQL大概如下:

select AA,BB,CC from st_table where ca=? and cb = ?

order by [oa|ob|oc] desc

limit xx,xx

 

现在的问题是:

根据条件,ca和cb过滤后,数据量也在100w左右,排序条件是可变的,可以是oa,ob,oc

,这样数据库排序,就要花好长时间

 

索引是ca和cb的联合索引,但是只对数据过滤起作用,排序还是非常的慢

 

因为是要放在web端展现,所以响应需要很快才行,这种问题怎么解决?

 

退而求其次,如果实在无法做到实时排序,定时的预处理 排序,也是可以接受的,问题是有哪些比较好的可行方案

不限数据库,求大神指点

 

 

 

 

 

 

 

<无标签>
举报
tianyawangyou
发帖于5个月前 10回/583阅
共有10个答案 最后回答: 5个月前

分区分表试试,根据ca或cb分

--- 共有 3 条评论 ---
tianyawangyou结合实际情况,我们这个条件,后续可能还得加上任意时间段的过滤,所以不太好分区分表,不过还是谢谢你的建议 5个月前 回复
mickelfeng嗯,是的 5个月前 回复
tianyawangyou你的意思是不是,通过分区,分表,去掉SQL中where条件,然后在order by字段上加索引? 5个月前 回复

建立索引,先去哪数据的主键id在去inner join 本身表获取行数据!

--- 共有 2 条评论 ---
独孤晓林 回复 @tianyawangyou : 做个联合索引 5个月前 回复
tianyawangyou先筛选id,再去join 数据,这一点,非常赞同,也打算这么改,但是索引怎么建? where的字段和order by的字段是不同的?这个怎么解决 5个月前 回复

过滤条件及排序规则固定的情况下,建议使用redis的自带的排序功能,将数据ID存储,翻页仅从redis中取对应数量的ID,然后通过这些指定ID去数据库查询。这样基本能实现实时查询。当然,数据库数据有增删的时候,redis中存储的ID排序集合也得增删。

既然你考虑过定时预处理,那么,需求方面应该也能控制过滤条件和排序规则固定,如果这两个不能固定,那么定时预处理也就无从谈起了。

--- 共有 3 条评论 ---
银杏果果 回复 @tianyawangyou : 假设索引ID为int型,int占4个字节,一千万个int也得三四十M,建议不要把全部数据放缓存。 5个月前 回复
银杏果果 回复 @tianyawangyou : 放缓存吧,最好缓存中只放唯一索引值,不然千万级数据全部放缓存,对内存消耗也挺大。 5个月前 回复
tianyawangyou过滤条件组合比较多,这个是硬需求,暂时没办法 我的思路是,根据排序字段oa,ob,oc,定时预处理,把数据排好序,存3份,存在一个地方,然后查询的时候,只需要根据查询条件,从头到尾,筛选数据就好 问题,就是排好序的数据存放在哪,数据库能保存这种顺序吗,还是说,只能放缓存,自己来实现筛数据? 5个月前 回复

第一次查询的时候,把id查出来,显示的时候,再用这些id去分页,把对应id的数据读出来。

缺点是显示的数据不是“实时”的

不是应该保存第一页的最后一个id

然后where里是id>$id

不就这么简单吗?

然后加缓存机制什么的一大堆

--- 共有 1 条评论 ---
tianyawangyou你这种方法适合的是下面这种场景吧: 1、数据库表的记录的固定的,不会再增加 2、where里面的查询条件,组合比较少的情况下 可以预处理,组合条件为key,value就是各个分页的id边界值,然后放在缓存? 我们的实际情况是,1、数据是会增加的 2、ca和cb的组合非常多 5个月前 回复
顶部