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


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

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

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    MySQL解压版安装及使用
    bitmap海量数据的快速查找和去重
    docker折腾笔记
    #ST表,单调栈#洛谷 5648 Mivik的神力
    #矩阵树定理,高斯消元,容斥定理#洛谷 4336 [SHOI2016]黑暗前的幻想乡
    #割点,Tarjan#洛谷 5058 [ZJOI2004]嗅探器
    #树状数组#洛谷 5677 [GZOI2017]配对统计
    #2-sat,Tarjan#洛谷 4171 [JSOI2010]满汉全席
    #Splay#洛谷 1486 [NOI2004]郁闷的出纳员
    #扫描线,线段树#洛谷 3875 [TJOI2010]被污染的河流
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1748482.html
Copyright © 2020-2023  润新知