计算年龄:PHP与MySQL,哪种方法更好?

计算年龄:PHP与MySQL,哪种方法更好?,php,mysql,sql,optimization,query-optimization,Php,Mysql,Sql,Optimization,Query Optimization,我在MySQL数据库中有大约500000条个人档案记录,其中包含一个生日列(dob)。因为我必须获得每个配置文件的年龄,所以我需要动态计算它,我可以通过PHP(date_diff(date_create($dob),date_create('today'))->y或通过SQL('SELECT TIMESTAMPDIFF(YEAR,dob,CURDATE())作为年龄')。 这两种方法中哪一种更快或更受欢迎,尤其是在我有数十万行的情况下?如果你想获得所有500000条记录,你应该在MySql中这样

我在MySQL数据库中有大约500000条个人档案记录,其中包含一个生日列(dob)。因为我必须获得每个配置文件的年龄,所以我需要动态计算它,我可以通过PHP
(date_diff(date_create($dob),date_create('today'))->y
或通过SQL
('SELECT TIMESTAMPDIFF(YEAR,dob,CURDATE())作为年龄')

这两种方法中哪一种更快或更受欢迎,尤其是在我有数十万行的情况下?

如果你想获得所有500000条记录,你应该在MySql中这样做,因为性能比PHP好


但是,如果您想获取其中的一些数据(例如10条记录),那么最好使用PHP进行处理。性能没有什么不同

如果你想得到所有500000条记录,你应该在MySql中这样做,因为性能比PHP好


但是,如果您想获取其中的一些数据(例如10条记录),那么最好使用PHP进行处理。而且性能没有什么不同

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

理想的方法是使用生成的列。自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;
然后,当您查询视图时,您将得到
年龄
。无论你在哪里提出质疑,这都是事实。在任何地方都是一样的逻辑


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

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

理想的方法是使用生成的列。自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;
然后,当您查询视图时,您将得到
年龄
。无论你在哪里提出质疑,这都是事实。在任何地方都是一样的逻辑

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

这里有一个测试:

创建一个包含100K个随机日期的表

drop table if exists birthdays;
create table birthdays (
    id int auto_increment primary key,
    dob date
);
insert into birthdays (dob)
    select '1950-01-01' + interval floor(rand(1)*68*365) day as dob
    from information_schema.COLUMNS c1
       , information_schema.COLUMNS c2
       , information_schema.COLUMNS c3
    limit 100000
;
运行这个PHP脚本

以下是一个测试:

创建一个包含100K个随机日期的表

drop table if exists birthdays;
create table birthdays (
    id int auto_increment primary key,
    dob date
);
insert into birthdays (dob)
    select '1950-01-01' + interval floor(rand(1)*68*365) day as dob
    from information_schema.COLUMNS c1
       , information_schema.COLUMNS c2
       , information_schema.COLUMNS c3
    limit 100000
;
运行这个PHP脚本


我不认为通过mysql做会更快。不过,您可以轻松地对其进行基准测试,我建议您这样做。如果您只想选择特定DOB的记录,那么您当然会使用SQL。如果对该列进行筛选,请始终使用SQL,因为它会减少您在源代码处处理的记录。您是否要一次获得所有
500000
记录?您可以通过询问usvivek来测试这一点:我必须将记录拆分为每页500-2000条,以使其可查看。但有时我需要处理后端的所有记录,我会胡乱猜测,通过mysql这样做会更快。不过,您可以轻松地对其进行基准测试,我建议您这样做。如果您只想选择特定DOB的记录,那么您当然会使用SQL。如果对该列进行筛选,请始终使用SQL,因为它会减少您在源代码处处理的记录。您是否要一次获得所有
500000
记录?您可以通过询问usvivek来测试这一点:我必须将记录拆分为每页500-2000条,以使其可查看。但有时我需要处理后端的所有记录