目前用的fecmall和fecro都是最新版,appfront和apphtmlt5选择分类后要好久才出来产品数据,分类下有8w产品数据左右,每次翻页要十几秒,看了下后台查询的慢sql,查询的时候用in,后边8w个id,好慢,这个有啥办法处理?
嗯,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
mongodb services
还有一种方式,就是将每个分类的产品弄少
譬如一级分类不让访问,只能访问各个子分类,各个子分类的商品比较少,那么查询起来会快一些。不过这种方式限制比较多,最好,还是用product mongodb services
product mongodb services
@Fecmall #2楼 大佬,我这边换成mongodb后,速度并没有比mysql的快,还慢了些,有什么办法处理吗
@ppoi #3楼
多少产品?是不是内存太低?mongodb还是单独需要1G+的内存
mongodb不应该慢,而且mongodb的并发能力比mysql高一个数量级。
@Fecmall #4楼 50w产品,我服务器有24G内存,这个应该够啊,我后台切换了数据库后,前端去点分页,发现用了mongodb的速度比mysql还不如,本来mysql已经好慢了,要10s+,来回切换mysql和mongodb,发现还是mongodb比较慢。我后台数据库只设置了分类产品为mongodb,其它的还是默认mysql,这个有没有影响
这个可能是索引问题,你是不是没有执行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
另外:
后台: 网站配置 --> appfront配置 --> 分类产品配置
网站配置
appfront配置
分类产品配置
分类页面-规格产品只显示一个sku? 设置成NO
分类页面-规格产品只显示一个sku
NO
设置No后,会去掉aggregate过程,会提升一定速度。
@Fecmall #7楼 感谢大佬,我按照你上边发的操作加索引后,目前翻页基本是稳定8s这样子,比原先好了一些,原先的十几秒有时候还不止,还有优化的空间吗?没有就只能先暂时这样了,目前这个还在接受范围内
@ppoi #8楼 50万产品,不应该这么慢的。你找找代码调试一下看看,这个优化应该就是索引问题。
另外,可以开启缓存,分类页开启一下,第二次访问就是秒开了。
嗯,耗时的原因应该是这里,因为需要进行group,mongodb用的是aggregate实现的
对于分类数据比较多,应该要用搜索引擎的,譬如elasticSearch来实现的,fecmall的es插件只实现了搜索。 理论上,分类也是可以的,不过没有实现
您如果不需要左侧的filter,可以去掉代码,不让他执行,这样绝对快,无缓存应该也可以秒开。 或者将filter这些属性做一下缓存也是可以的。