请教个 sql 查询问题

讨论 未结 11 51
brader
brader 会员 2022年11月15日 03:43 发表
<p>需求大概是这样:根据搜索条件 查询商品列表,每个商品有分类属性,需要根据分类来分组显示,分类下没有商品的分类不展示,因为商品数据量非常庞大,所以一次搜索出来的商品无法展示完全,我采用了分页,根据搜索条件以及每个分类 ID 来分页查商品,因为产品需要只展示有商品的分类,所以在这之前,我的查出来有商品的分类列表给前端。<br> 因搜索条件灵活动态多变,所以这个分类基本无法固定下来,缓存意义也不大。</p> <p>开始我采用了方案一: sql 查询语句 where 过滤搜索条件,GROUP BY 分类 id ,该加的索引也加上了。 该方案大部分都是正常的,后面有测试给我反馈有些很慢,我排查到是某些店铺商品数量非常多,然后搜索条件又需要筛选辅表关联表,主表:辅表 是 1:n 关系,所以数据量非常庞大(有多大呢,举个例子,有些一个商品绑了 5 万多个车型,为什么允许绑这么多,是否合理,我也不想纠结,以前的技术肯定也是无奈),GROUP BY 分类 id 有点久。</p> <p>后续我尝试了方案二: 拿着该店铺绑定的所有分类 id ,循环遍历 sql 查询语句 where 过滤搜索条件+分类 id ,判断有无商品存在,该语句执行状况非常好,每句在 10-20ms ,查 20 个分类都不到 500ms 。大部分店铺也是 20 个分类以下的。</p> <p>我统计了分类,少部分店铺存在 50-100 个分类,这些店铺采用方案二我非常担心,毕竟是循环,分类多了,累积时间就久。</p> <p>想请教下各位,这种需求有更好的方案吗?我能想的办法都想了,不知道是产品设计复杂还是技术太菜了。。。</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
11个回复
  • nekolr
    2022年11月15日 03:43
    产品设计上可以考虑分类多了不用都展示
    0 0
  • brader
    2022年11月15日 06:44
    目前就是采用循环查询的,也加了 5 分钟缓存,不过缓存作用不是特别大,因为用户输入、筛选构建的搜索查询条件时时在变化。hashjoin 没听过,哈哈。
    0 0
  • Dganzh
    2022年11月15日 06:44
    方案 2 ,分类多时并发查可行不?
    0 0
  • dqzcwxb
    2022年11月15日 06:44
    #6 去排查耗时代码吧,按你这么描述十有八九是耗时在双重循环匹配上了
    0 0
  • gy123
    2022年11月15日 06:44
    分类筛选的数据是面对所有用户的,感觉还是得缓存,缓存粒度小点; 比如现在需要通过分类以及其他条件筛选,那么先将数据根据分类类型进行逐个缓存,然后在细分,在应用层进行一个合并数据;
    0 0
  • brader
    2022年11月15日 06:44
    没有尝试过,因为目前二三十个分类循环,响应时间还是挺快的,项目是 PHP 写的,也不怎么方便开多线程并发
    0 0
  • brader
    2022年11月15日 06:44
    可能我描述的不是很到位,代码是刚写的,我很确认代码逻辑上是没有双层循环的,只循环查询了分类列表,这个分类列表也很有限,100 个以内,压力主要在数据库
    0 0
  • brader
    2022年11月15日 06:44
    单缓存分类条件的话,辨识度不高,主要是车型太多了,有些一个商品绑了 5 万多个车型
    0 0
  • gy123
    2022年11月15日 06:44
    看看具体数据量,拿出来全放内存看看能占多少,纯走内存查询那肯定很快..或者就是看看有啥规律,将数据进行处理冗余到另一个表,大宽表操作,减少查询等
    0 0
  • yogogo
    2022年11月15日 07:45
    子查询啊,一句 sql 就出来了
    0 0
  • yogogo
    2022年11月15日 07:45
    select 分类 id, (select count(*) from 商品 where 分类 id = 分类 id limit 1) num from 分类 having num > 0
    0 0