按分类统计商品总数的性能优化思考

简介: 如上图,在很多购物类商城系统中经常能看到类似的产品分类列表,今天市场部的同志们要求每个分类后要显示该类的产品总数,并且没有产品的分类不用显示。公司这个项目中的分类有近1000种(并且是无限级分类的树型结构),如果按常规统计方法,每个分类ID都去count一下(同时考虑到每个分类的下级子分类产品数),这样的处理效率肯定很低的。

img_ac23d8e8f5b7cfbc83e463921def3763.jpg

如上图,在很多购物类商城系统中经常能看到类似的产品分类列表,今天市场部的同志们要求每个分类后要显示该类的产品总数,并且没有产品的分类不用显示。公司这个项目中的分类有近1000种(并且是无限级分类的树型结构),如果按常规统计方法,每个分类ID都去count一下(同时考虑到每个分类的下级子分类产品数),这样的处理效率肯定很低的。

 

想了个办法从二个层面优化:

1.数据库层面

创建一个临时表,用游标把产品总数分类事先统计好,一次性在数据库中完成,避免ASPX页面中的多次查询请求。

-- =============================================
-- Author:		<菩提树下的杨过>
-- Create date: <2010-05-31>
-- Description:	<分类统计产品总数>
-- =============================================
CREATE PROCEDURE up_ProductClassCount 	
AS
BEGIN	
	SET NOCOUNT ON;    
	--select .. into 操作会创建新表,下面的语句保证了创建前先删除同名表
	if (select COUNT(*) from sys.tables where name = 'T_ProductClassCount')>0
		drop table T_ProductClassCount

	--把分类表中的id先插入到临时表中
	SELECT F_Id as F_ClsId ,0 as F_Count INTO T_ProductClassCount FROM T_Class WHERE F_Type='Product'

	--用游标对临时表进行汇总处理
	declare @clsid uniqueidentifier;
	declare @count int;
	--创建游标
	declare _temp_cursor Cursor 
		For Select * From T_ProductClassCount
	Open _temp_cursor --打开游标

	Fetch next From _temp_cursor  
	Into @clsid,@count

	While(@@Fetch_Status = 0)
	Begin
		select @count=COUNT(0) from T_Product where F_ClsId in (select F_Id from T_Class where F_Id=@clsid or F_ParentIdStr like '%' + CONVERT(nvarchar(50),@clsid) + '%');
		update T_ProductClassCount set f_count=@count where f_clsid=@clsid;
		print CONVERT(nvarchar(50),@clsid) + ',' + Convert(nvarchar(50),@count) --辅助调试的打印语句
		Fetch next From _temp_cursor  Into @clsid,@count
	End
	Close _temp_cursor --关闭游标
	Deallocate _temp_cursor --释放游标
END

2.页面的数据缓存优化

分类列表显示时利用数据依赖缓存,如果临时表的数据没有变化,则直接从缓存中取值显示,如果上述临时表的数据有变化,则更新缓存。 

3.产品在增删改时,调用一下步骤1中的存储过程,以更新临时表.

 

注:因为公司平台每天新增的产品数并不多,主要压力来自数据的查询,所以总体看下来这样优化的效果还是比较理想的。

目录
相关文章
|
3月前
|
存储 缓存 API
信息检索重排序技术深度解析:Cross-Encoders、ColBERT与大语言模型方法的实践对比
本文将深入分析三种主流的重排序技术:Cross-Encoders(交叉编码器)、ColBERT以及基于大语言模型的重排序器,并详细阐述各方案在实际应用中的性能表现、成本考量以及适用场景。
226 3
信息检索重排序技术深度解析:Cross-Encoders、ColBERT与大语言模型方法的实践对比
|
10月前
|
缓存 Java 数据库连接
MyBatis缓存机制
MyBatis提供两级缓存机制:一级缓存(Local Cache)默认开启,作用范围为SqlSession,重复查询时直接从缓存读取;二级缓存(Second Level Cache)需手动开启,作用于Mapper级别,支持跨SqlSession共享数据,减少数据库访问,提升性能。
153 1
|
前端开发 应用服务中间件 nginx
简单几步,将React项目脚手架Webpack换成Vite⚡⚡,附带性能比较和思考
简单几步,将React项目脚手架Webpack换成Vite⚡⚡,附带性能比较和思考
|
大数据
大数据Azkaban失败任务预警
大数据Azkaban失败任务预警
410 0
|
Java 缓存 Linux
如何回答性能优化的问题,才能打动阿里面试官?
阿里妹导读:日常工作中,我们多少都会遇到应用的性能问题。在阿里面试中,性能优化也是常被问到的题目,用来考察是否有实际的线上问题处理经验。面对这类问题,阿里工程师齐光给出了详细流程。来阿里面试前,先看看这篇文章哦。
21467 2
如何回答性能优化的问题,才能打动阿里面试官?
|
机器学习/深度学习 测试技术
机器学习系列 | 01:多类别分类任务(multi-class)中为何precision,recall和F1相等?
在 multi-class 分类任务中,如果使用 micro 类指标,那么 micro-precision, micro-recall和micro-F1值都是相等的。本文主要针对这个现象进行解释。
|
前端开发 C# 开发工具
WPF 自定义柱状图 BarChart
原文:WPF 自定义柱状图 BarChart WPF 自定义柱状图  当前的Telerik控件、DevExpress控件在图表控件方面做得不错,但是有时项目中需要特定的样式,不是只通过修改图表的模板和样式就能实现的。
1217 0
|
关系型数据库 MySQL 数据库
[ MySQL ] 使用Navicat进行MySQL数据库备份 / 还原(Part 1:备份.nb3文件方式)
本文主要讲解如何用Navicat(Navicat Premium ,或者Navicat for mysql)进行MySQL备份和恢复数据库。 本文主要大纲为:使用Navicat备份工具方式进行备份和还原,其中包括还原自身数据库和还原到其他目标库。
7662 0
[ MySQL ] 使用Navicat进行MySQL数据库备份 / 还原(Part 1:备份.nb3文件方式)
|
运维 监控
移动端运维,让您随时随地“掌”控管理
监控运维系统已实现移动端运维,系统提供了移动端的监控概览、设备信息查询、告警处理、事件跟踪等功能,用户或运维人员可通过手机,即可实时掌握设备的运行情况,方便运维人同日常化运维需求,减少运维人员的操作强度,通过手机与PC端实时互动,响应派单及故障告警等信息,提高运维效率,为用户提供更好的运维服务。
1081 0
移动端运维,让您随时随地“掌”控管理
|
定位技术
Xbox Series X加载飞快,《大镖客2》仅需25秒
在运行《荒野大镖客:救赎2》时,Xbox One X的加载速度为1分27秒,而Xbox Series X达到了惊人的25秒,超过绝大部分PC。
1070 0
Xbox Series X加载飞快,《大镖客2》仅需25秒