php - 计算年龄:PHP vs MySQL,哪种方法更好?
问题描述
我在 MySQL 数据库中有大约 500,000 条个人资料记录,其中包含一个生日列 (dob)。由于我必须获取每个配置文件的年龄,我需要动态计算它,我可以通过 PHP(date_diff(date_create($dob), date_create('today'))->y)
或 SQL 来完成('SELECT TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age')
。两者中哪一个更快或更优选,尤其是如果我有数十万行?
解决方案
一般来说,最好的方法是在服务器上进行这样的计算。
理想的方法是使用生成的列。这从 MySQL 5.7.5 开始可用,并表示为:
alter table t add age unsigned as
(TIMESTAMPDIFF(YEAR, dob, CURDATE()));
唉,您只能对生成的列使用确定性函数。 curdate()
并且now()
不是确定性的,因为它们的值会随着每次调用而改变。
下一个最好的事情是使用视图:
create view v_t as
select t.*,
TIMESTAMPDIFF(YEAR, dob, CURDATE())
from t;
然后,当您查询视图时,您将拥有age
. 无论您在哪里查询都是如此。而且到处都是同样的逻辑。
在服务器上进行计算的唯一警告是它使用服务器时间,而不是本地应用程序时间。如果这是一个问题,那么这是在本地进行计算的有力论据。
推荐阅读
- python - QWebEngineProfile downloadRequested 没有被调用
- wordpress - “主页”面包屑文本未使用 Loco 翻译插件 WordPress 翻译成法语
- django - 成功后芹菜不返回任何结果?
- c++ - ID2D1Bitmap 到带有 Alpha 但不是 PNG 的 Wic
- javascript - 如何将一个网址重定向到另一个网址?
- google-api - 是否可以使用任何 REST API 客户端获取 google api 访问令牌
- azure - 如何在任务 DotNetCoreCLI@2 中使用“nuget push”和 --skip-duplicate 选项
- python - Numpy拆分数组而不复制
- javascript - 如何在 React 单个项目上集成两个 Web 模板主题?
- wordpress - Woocommerce - 如何在结帐时使电子邮件字段可选