计算年龄:PHP与MySQL,哪种方法更好?
我在MySQL数据库中有大约500000条个人档案记录,其中包含一个生日列(dob)。因为我必须获得每个配置文件的年龄,所以我需要动态计算它,我可以通过PHP计算年龄: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中这样
(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条,以使其可查看。但有时我需要处理后端的所有记录