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

简介: 如上图,在很多购物类商城系统中经常能看到类似的产品分类列表,今天市场部的同志们要求每个分类后要显示该类的产品总数,并且没有产品的分类不用显示。公司这个项目中的分类有近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中的存储过程,以更新临时表.

 

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

目录
相关文章
分页最好的作用是做好统计,可以用来基本条件列表的统计,可以用来统计多平台,使之呈现列表,预算统计,以及必要的技术,项目名称,常用链接
分页最好的作用是做好统计,可以用来基本条件列表的统计,可以用来统计多平台,使之呈现列表,预算统计,以及必要的技术,项目名称,常用链接
|
存储 固态存储 测试技术
优化后,ES 做到了几十亿数据检索 3 秒返回!
优化后,ES 做到了几十亿数据检索 3 秒返回!
|
数据挖掘
白话Elasticsearch41-深入聚合数据分析之案例实战__过滤+聚合:统计价格大于2000的电视平均价格
白话Elasticsearch41-深入聚合数据分析之案例实战__过滤+聚合:统计价格大于2000的电视平均价格
105 0
|
SQL 数据挖掘
白话Elasticsearch39-深入聚合数据分析之案例实战_搜索+聚合: 统计指定品牌下每个颜色的销量
白话Elasticsearch39-深入聚合数据分析之案例实战_搜索+聚合: 统计指定品牌下每个颜色的销量
157 0
|
算法 数据挖掘 索引
白话Elasticsearch48-深入聚合数据分析之 Percentiles Aggregation-percentiles百分比算法以及网站访问时延统计及Percentiles优化
白话Elasticsearch48-深入聚合数据分析之 Percentiles Aggregation-percentiles百分比算法以及网站访问时延统计及Percentiles优化
145 0
|
算法 前端开发
【前端算法】独一无二的出现次数,统计次数加去重
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
119 0
|
自然语言处理 搜索推荐 算法
优化搜索排序结果从而“ 提升CTR、CVR业务指标”
搭建搜索功能不难,难的是如何提高搜索质量,帮助用户快速找到心中所想的内容或商品,那么搜索结果的相关性排序则是影响用户体验最关键的一环,本文通过阿里云开放搜索电商行业解决方案和大家聊一聊如何优化排序结果
6824 0
优化搜索排序结果从而“ 提升CTR、CVR业务指标”
|
数据库 Python
统计各个分类和标签下的文章数
在我们的博客侧边栏有分类列表和标签列表,显示博客已有的全部文章分类。现在想在分类名和标签名后显示该分类或者标签下有多少篇文章,该怎么做呢?最优雅的方式就是使用 django 的 annotate 方法。 Model 回顾 回顾一下我们的 model 代码,django 博客有一个 Post 和 Category 模型,分别表示文章和分类: blog/models.py class Post(models.Model): title = models.CharField('标题', max_length=70) body = models.TextField('正文')
172 0
|
BI
利用时间维度统计分页
在进行数据统计的时候,不能简单的通过数据表数据条数进行分页。这时,可以通过时间维度进行分页。 //以时间作为查询条件进行用户统计查询 $start_date = request('date')['start'] ? : ''; $end_date = request('date')['end'].
900 0