MYSQL 优化:获取数据 w.r.t 星期几
Posted
技术标签:
【中文标题】MYSQL 优化:获取数据 w.r.t 星期几【英文标题】:MYSQL Optimzation: Fetching Data w.r.t DAY OF THE WEEK 【发布时间】:2011-11-04 07:30:27 【问题描述】:我必须在 CRON 上工作,它将每周在订阅者订阅之日向订阅者发送电子邮件。例如,如果用户 A 在星期四订阅,用户 B 在星期三订阅,那么用户 A 将在每个星期四收到邮件,用户 B 在每个星期三收到邮件。
现在我的方法如下:
1- 首先获取当前(TODAY)日期的星期几并赋值给变量
2- 运行 SELECT 查询并获取订阅日与今天日期相似的所有订阅者 ID。我打算使用 mysql 的 dayofweek() 从 Week 中提取一天,
3- 获得所有 ID 后,然后通过电子邮件将最近 7 天的活动发送给这些订阅者。
让我有点困惑的是 DAYOFWEEK() 函数,它基于列并且看起来很昂贵。你会建议什么替代方案?(假设表格会有很多数据)
【问题讨论】:
您现在是否遇到任何性能问题? 这是一个经典的计算存储权衡。您想在每次查询时计算 dayofweek(),还是想计算一次并将其存储在表中?正如上校所说,如果您现在没有遇到性能问题,请不要在表中包含重复数据:计算每次传递的星期几。如果您遇到问题,可以选择去规范化。 该系统目前处于开发阶段,但该系统是一个成员超过 400 万的大型数据库的一部分,我正在考虑这一点 【参考方案1】:每行函数很少随着数据库表的增长而很好地扩展。
您应该做的第一件事是确保确实存在要解决的性能问题。总是从第三范式开始,只有当你发现这样的问题时才回归,否则你的努力就白费了。可能是速度没那么差,还是坚持3NF吧。
如果发现是性能问题,解决它的一种方法是添加一个名为 weekday 的索引列,该列将保存用户订阅的星期几。
这在技术上破坏了 3NF,因为该属性取决于订阅日期,而订阅日期不太可能成为密钥的一部分。如果您单独更新一个或另一个,它也可能不同意该订阅日期。
但是您可以通过插入/更新触发器来缓解该问题,该触发器强制weekday
列同意订阅日期,确保他们永远不会不同意。
那么你的查询就变成了这样的:
dow = Now.dayOfWeek()
rowSet = executeQuery ("select sub_id from subscribers where weekday = ?", dow)
然后处理每个订阅者(如果您愿意,也可以作为一个大的 honkin 查询)。
您不必检索 每一 行来执行 getWeekDay (subscription_date)
并过滤行,这一事实应该会大大提高查询速度。
绝大多数数据库的读取频率远高于写入频率,通过将计算成本转移到插入/更新上,您可以有效地将成本摊销到所有选择中。
假设您的订阅者订阅超过一周(因为您每周发送一次他们的东西),这将比在 select
上计算更有效。
而且,虽然这会在您的表中占用更多空间(由于额外的列和索引),但请查看“我的查询不够快”问题与“我的数据库太大”问题的比率问题。前者远大于后者。
【讨论】:
谢谢!这是一种非常简洁的方法,因为我不需要经常计算工作日。我所做的是我在插入和索引日期列时计算的。以上是关于MYSQL 优化:获取数据 w.r.t 星期几的主要内容,如果未能解决你的问题,请参考以下文章
pandas通过DatetimeProperties对象获取日期对象在所在周的周几星期几的名称信息(week name)并生成新的数据列计算不同星期名称下其它数据列的均值