按分类统计商品总数的性能优化思考
时间:2022-04-23
本文章向大家介绍按分类统计商品总数的性能优化思考,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
如上图,在很多购物类商城系统中经常能看到类似的产品分类列表,今天市场部的同志们要求每个分类后要显示该类的产品总数,并且没有产品的分类不用显示。公司这个项目中的分类有近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中的存储过程,以更新临时表.
注:因为公司平台每天新增的产品数并不多,主要压力来自数据的查询,所以总体看下来这样优化的效果还是比较理想的。
- js中页面刷新和页面跳转的方法总结
- PixelBender(着色器)初体验
- Centos下堡垒机Jumpserver V3.0环境部署完整记录(1)-安装篇
- CSS好看的按钮
- Metaball(元球)效果学习
- ASP.NET MVC 4 RC的JS/CSS打包压缩功能
- 表格可在线编辑效果
- CSS侧边栏宽度不动(更改页面宽度时),内容区宽度自适应
- JS网页顶部弹出可关闭广告图层
- 未来会不会出现人类大脑与人工智能进行链接,而产生的超级大脑?
- android布局文件中android:icon="?attr/menuIconCamera"找不到对应图标路径
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(1)表结构
- Centos7修改默认网卡名(改为eth0)以及网卡启动报错RTNETLINK answers: File exists处理
- 通过企业分布式缓存共享运行时数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 逻辑回归算法原理及实现
- Python链表详细笔记
- 26个你需要学习的Firefox配置技巧,改进体验和加快浏览器响应速度
- Softmax算法原理及实现
- Android Activity 活动的生命周期
- Android学习笔记,不断更新
- cJSON,c语言的JSON库!
- 自己动手实现4大免费聊天机器人:小冰、图灵、腾讯、青云客
- Android Spinner下拉框的基本使用
- hadoop本地运行的两个案例。官方Grep案例、官方WordCount案例。
- 腾讯智能闲聊机器人详细开发教程
- 用PyTorch实现MNIST手写数字识别(非常详细)
- 手把手教你从零开始用Java写爬虫
- STM32 cjson的GBK/UTF-8/UNICODE转换、显示中文、GBK字库
- 都说Linux很重要,你会几个Linux命令?来看看这道面试题目。