使用fecro产品分类筛选页面好慢

bug问题 · ppoi · 于 2年前 发布 · 1147 次阅读

目前用的fecmall和fecro都是最新版,appfront和apphtmlt5选择分类后要好久才出来产品数据,分类下有8w产品数据左右,每次翻页要十几秒,看了下后台查询的慢sql,查询的时候用in,后边8w个id,好慢,这个有啥办法处理?

共收到 12 条回复 问题提问
Fecmall#12年前 0 个赞

嗯,mysql的确存在这个问题

1.分类和产品是多对多关系,需要用一个中间表建立对应关系,要么用in查询,要么用join,无论那种,都会很慢。

2.产品多,可以用mongodb,mongodb的数据结构是多维的,相当于多维数组,因此不需要中间表,产品表的分类数据是一个分类id数组,因此就没有join,因此就没有问题

3.当然,对于大站的分类页面,最优的解决方式,肯定是用搜索引擎来解决,譬如用elasticSearch,这个肯定是最优的,但是对技术要求肯定高,目前用搜索引擎来解决分类部分,需要自己二开(fecmall只有开发了搜索部分,用的搜索引擎)

结论:您可以安装mongodb,产品表使用mongodb services:https://www.fecmall.com/doc/fecshop-guide/develop/cn-2.0/guide-fecshop-2-use-mongo.html

Fecmall#22年前 0 个赞

还有一种方式,就是将每个分类的产品弄少

譬如一级分类不让访问,只能访问各个子分类,各个子分类的商品比较少,那么查询起来会快一些。不过这种方式限制比较多,最好,还是用product mongodb services

ppoi#32年前 0 个赞

@Fecmall #2楼 大佬,我这边换成mongodb后,速度并没有比mysql的快,还慢了些,有什么办法处理吗

Fecmall#42年前 0 个赞

@ppoi #3楼

多少产品?是不是内存太低?mongodb还是单独需要1G+的内存

mongodb不应该慢,而且mongodb的并发能力比mysql高一个数量级。

ppoi#52年前 0 个赞

@Fecmall #4楼 50w产品,我服务器有24G内存,这个应该够啊,我后台切换了数据库后,前端去点分页,发现用了mongodb的速度比mysql还不如,本来mysql已经好慢了,要10s+,来回切换mysql和mongodb,发现还是mongodb比较慢。我后台数据库只设置了分类产品为mongodb,其它的还是默认mysql,这个有没有影响

Fecmall#62年前 0 个赞

这个可能是索引问题,你是不是没有执行mongodb的migrate:

./yii mongodb-migrate  --interactive=0 --migrationPath=@fecshop/migrations/mongodb

这里我优化了一下

打开@fecshop\models\mongodb\Product.php 文件,将create_index()函数改成如下,然后再执行上面的脚本,创建索引,然后试试速度如何。

public static function create_index()
    {
        $indexs = [
            ['spu'        => -1],
            ['sku'        => -1],
            ['category' => -1, 'status' => -1, 'score'           => 1],
            ['category' => -1, 'status' => -1, 'review_count'    => 1],
            ['category' => -1, 'status' => -1, 'favorite_count'  => 1],
            ['category' => -1, 'status' => -1, 'created_at'      => 1],
            ['category' => -1, 'status' => -1, 'final_price'     => 1],
        ];

        $options = ['background' => true];
        foreach ($indexs as $columns) {
            self::getCollection()->createIndex($columns, $options);
        }
    }

您排查一下mongodb的索引问题,如果还解决不了,就加微信聊吧:https://www.fecmall.com/contacts

Fecmall#72年前 0 个赞

另外:

后台: 网站配置 --> appfront配置 --> 分类产品配置

分类页面-规格产品只显示一个sku? 设置成NO

设置No后,会去掉aggregate过程,会提升一定速度。

ppoi#82年前 0 个赞

@Fecmall #7楼 感谢大佬,我按照你上边发的操作加索引后,目前翻页基本是稳定8s这样子,比原先好了一些,原先的十几秒有时候还不止,还有优化的空间吗?没有就只能先暂时这样了,目前这个还在接受范围内

Fecmall#92年前 0 个赞

@ppoi #8楼 50万产品,不应该这么慢的。你找找代码调试一下看看,这个优化应该就是索引问题。

Fecmall#102年前 0 个赞

另外,可以开启缓存,分类页开启一下,第二次访问就是秒开了。

ppoi#112年前 0 个赞
  • @Fecmall #10楼 感谢大佬,缓存我已经开启了,原先左侧默认过滤属性的值是 colour,size我在后台没修改,实际上我并没有这个属性,改完后比原先好些了,现在基本上4-6s,开启缓存后可以秒出,但是查了mongodb慢日志后,我发现耗时比较多的是分类左侧部分,一个是根据品牌分组统计,另一个是根据后台设置的默认属性分组统计(实际上这个我并不需要,但是后台设置为空时会报错)。按照我的理解,这一块可以单独做缓存,我第一页是这个数据,翻第二页的时候左侧的数据并不会改变,没有必要重新进行统计
Fecmall#122年前 0 个赞

嗯,耗时的原因应该是这里,因为需要进行group,mongodb用的是aggregate实现的

对于分类数据比较多,应该要用搜索引擎的,譬如elasticSearch来实现的,fecmall的es插件只实现了搜索。 理论上,分类也是可以的,不过没有实现

您如果不需要左侧的filter,可以去掉代码,不让他执行,这样绝对快,无缓存应该也可以秒开。 或者将filter这些属性做一下缓存也是可以的。

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics