首页 > 解决方案 > 计算年龄: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')。两者中哪一个更快或更优选,尤其是如果我有数十万行?

标签: phpmysqlsqloptimizationquery-optimization

解决方案


一般来说,最好的方法是在服务器上进行这样的计算。

理想的方法是使用生成的列。这从 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. 无论您在哪里查询都是如此。而且到处都是同样的逻辑。

在服务器上进行计算的唯一警告是它使用服务器时间,而不是本地应用程序时间。如果这是一个问题,那么这是在本地进行计算的有力论据。


推荐阅读