千万级数据,多表(大概9个表)分组查询汇总 sql 优化 问题

1. 运行环境#

lnmp

1). 当前使用的 Laravel 版本?#

laravel8

2). 当前使用的 php/php-fpm 版本?#

PHP 版本:8.0.3

3). 当前系统#

centOS7.9

4). 业务环境#

生产环境

5). 相关软件版本#

mysql 8.0.1

2. 问题描述?#

现在有个商品信息表大概几万数据,需要关联大概九个表,类目表(cate),有两个表(goodsFlow,goodsFlowPerson)有一千多万数据,goodsSpus,adGoods(adGoodsSum)大概百万数据,skuDaily,refundOrderGoods,refundSkuDaily 有几十万数据,现在需要商品信息表关联这些表,分组汇总所需要的字段数据,该加的索引全部加了,强制索引也用了,千万级表扫描行数还有 280 多万,百万级表扫描行数也有几十万行(业务砍不了,必须这么多表),按接口拆分过 sql 不是很理想

千万级数据,多表(大概9个表)分组查询汇总 sql 优化 问题

3. 您期望得到的结果?#

这个 sql 该怎么优化,或者怎么拆分能达到 1 秒左右

4. 您实际得到的结果?#

按时间段查询大概 3 个月,整个 sql 执行完还要八九秒

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

同步到其他适合大数据查询的数据库

1年前 评论
Alone88 (作者) 1年前
nb_xw (楼主) 1年前
Alone88 (作者) 1年前
nb_xw (楼主) 1年前
nb_xw (楼主) 1年前
讨论数量: 32

同步到其他适合大数据查询的数据库

1年前 评论
Alone88 (作者) 1年前
nb_xw (楼主) 1年前
Alone88 (作者) 1年前
nb_xw (楼主) 1年前
nb_xw (楼主) 1年前

得上 es 了

1年前 评论
nb_xw (楼主) 1年前

试试 doris,bi 专用 :grin:,合理合并数据

1年前 评论
nb_xw (楼主) 1年前

把你那个 whereHas 改一下改成 join 走索引 whereHas 大量数据的时候很慢

1年前 评论
nb_xw (楼主) 1年前
lijizheng (作者) 1年前
nb_xw (楼主) 1年前
lijizheng (作者) 1年前
lijizheng (作者) 1年前

whereHas 改成 whereHasIn

1年前 评论
nb_xw (楼主) 1年前

优化个毛线,clickhouse 就是专为这种业务实现的

1年前 评论
nb_xw (楼主) 1年前
QIN秦同学 1年前
不高兴就喝水 (作者) 1年前

在源数据表再怎么优化,也不会有太好的结果,如你文章所说,强制索引,仍然要扫描几百万数据,即便是覆盖索引,查询速度也比较慢,这还不算你的数据库聚合运算消耗的时间,如果再有分页,仅 count 查询就非常耗时,当然 myisam 引擎查询要比 innodb 更有优势些,根据你说的目前只有 2 种方案:

  1. 独立业务汇总统计表,在源数据表业务上做钩子回写统计,或者时间粒度比较低的定时任务统计汇总
  2. 换数据库,比如 clickhouse 去做这方面统计。
1年前 评论
nb_xw (楼主) 1年前

whereHas 在大数据面前不是一个好的选择

1年前 评论
nb_xw (楼主) 1年前

clickhouse 吧,做过类似的项目,laravel 也有扩展包 github.com/the-tinderbox/Clickhous... ,你要是有心思封装下,sql 查询的代码都不用怎么改

1年前 评论
nb_xw (楼主) 1年前

前面给过方案了,换其它库,再补充一些信息。

现有库主要是 OLTP,适合业务写入,分析类场景 OLAP 类型的分析库会更合适。比如前面提到了百度云产品,也可以看下阿里云 ADB,用 DTS 将业务库 OLTP 同步到 OLAP ADB 库,在 ADB 库里面完成查询,就很方便了。唯一缺点可能是需要花点钱,但这个钱花的收益还是比较大的。

仅供参考!

1年前 评论
nb_xw (楼主) 1年前

这 sql 写的最后查询的正不正确自己都不敢保证

1年前 评论
nb_xw (楼主) 1年前