PHP处理百万级数据库分页列表展示的优化方案

使用的php框架是lumen、数据mysql5.7、操作系统是centos

需求:
数据表内的数据每日递增目前已经有200w+的数据,现在有个查询的需求,需要groupby多个字段求和统计,前端可以自行定义是哪个字段升序、降序排序。

目前的解决方案
根据请求的条件拼接生成md5的key值(因为有排序的需求,所以排序的字段、分页都会加入key的拼接),将请求结果放在nosql。相同条件的请求直接读取缓存。

瓶颈:
每次的分页,更换排序都重新走数据库请求数据,请求效率没有提升,我想过将所有数据全部存入缓存,由业务来分页和排序,但是数据量太大容易内存溢出,请问大家有没有更好的方案

阅读 2.4k
4 个回答

这是个妥协的过程,得跟业务沟通. 不是所有的需求技术都能解决的. 如果数据多大,且查询较复杂,你可以按照1楼的使用搜索引擎, 或者使用分表等操作. 将数据量变小。200W日增多少这个有过了解? 如果占了索引的分表. 应该也能接受. 我以前了解过的业务像类似于统计的东西都是单独的. 而不跟主业务相关联。

首先尽可能的和业务沟通,排序的字段尽可能合理和少。
如果数据变更频繁且实时性要求高的话,缓存不太有意义。以前针对一些大屏报表,我们是每隔一段时间刷的,存储每页计算后的结果,多种排序条件就存多份,这样翻页查询每次的数据量都比较小,当然这是特定的场景了。
如果不是太频繁走缓存的话,可以考虑整体数据存一份(比如按照id排序的),其他字段的排序仅存储对应字段和id的映射。

你要实时基本无解啊,除非出钱堆机器。这种统计类的,最好放到业务以外的数据仓库,洗出宽表 做成t+1

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏