日历事件模块数据加载速度过慢的修复方案咨询
日历事件模块加载慢问题优化方案
问题背景
日历事件模块加载耗时约10秒,尝试关闭待处理订单数量为0的显示后问题仍未解决,询问是否可通过忽略无待处理订单的日期逻辑来修复。
当前查询代码
query = String.Format("SELECT COUNT(*) FROM `orders_list` WHERE `Ordered_Date` = '{0}' AND `Status` = 'For Delivery'", Program.stcYear + "-" + Program.stcMonth + "-" + lblDay.Text); Program.ExecuteCommand(query); if (Program.reader.Read()) { int count = Convert.ToInt32(Program.reader.GetString(0)); if(count >= 1) { lblPendings.Text = "Pending: " + count; } } Program.CloseConnections();
核心问题与优化方案
核心原因
当前代码大概率是针对日历中每个日期单独执行一次查询(比如遍历一个月30天就发30次请求),频繁的数据库交互是加载慢的主要原因,和是否隐藏0数量显示无关。
具体优化步骤
批量查询替代循环单查
一次性查询当前月份所有有待处理订单的日期及对应数量,减少数据库请求次数:// 批量获取当月所有有效订单的日期和数量 string query = $"SELECT Ordered_Date, COUNT(*) FROM `orders_list` WHERE Ordered_Date BETWEEN '{Program.stcYear}-{Program.stcMonth}-01' AND '{Program.stcYear}-{Program.stcMonth}-31' AND `Status` = 'For Delivery' GROUP BY Ordered_Date"; Program.ExecuteCommand(query); // 把结果存入字典,方便后续快速查询 Dictionary<string, int> pendingDateCounts = new Dictionary<string, int>(); while (Program.reader.Read()) { string targetDate = Program.reader.GetString(0); int orderCount = Program.reader.GetInt32(1); pendingDateCounts[targetDate] = orderCount; } Program.CloseConnections(); // 遍历日历日期时直接从字典取值 string currentDate = $"{Program.stcYear}-{Program.stcMonth}-{lblDay.Text}"; if (pendingDateCounts.TryGetValue(currentDate, out int count) && count >= 1) { lblPendings.Text = $"Pending: {count}"; }添加联合索引加速查询
在数据库中为orders_list表创建Ordered_Date和Status的联合索引,大幅提升查询效率:CREATE INDEX idx_ordered_date_status ON orders_list(Ordered_Date, Status);修复SQL注入漏洞
原代码用String.Format拼接SQL存在安全风险,改成参数化查询(需根据Program类的参数传递方式调整):// 参数化查询示例(单日期场景) string query = "SELECT COUNT(*) FROM `orders_list` WHERE `Ordered_Date` = @targetDate AND `Status` = 'For Delivery'"; // 假设Program支持添加参数的方法 // Program.AddParameter("@targetDate", $"{Program.stcYear}-{Program.stcMonth}-{lblDay.Text}"); // Program.ExecuteCommand(query);
内容的提问来源于stack exchange,提问作者Diaz
相关产品推荐
相关产品推荐

