2011-04-07 51 views
0

我有以下两个查询,我不知道有什么更高效的做法:a)使用子查询和内部连接或b)多次调用CONVERT_TZ()?子查询与运行函数的效率是多少次?

或者也许有更有效的方法。任何想法将不胜感激!

查询所做的是使用已存储的偏移值将DATETIME从一个时区转换为另一个(EDT:GMT-4)。 在生产中运行此查询时,我将拥有几千条记录。

USE weblist; 

SELECT metropolitan_area 
    ,date_time 
    ,gmt_offset 
    ,gmt_offset + 4 AS hours 
    ,CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') AS EDT 
    ,DAYOFMONTH(date_time) AS day 
    ,MONTH(date_time) AS month 
    ,DATE_FORMAT(date_time, '%h:%i %p') AS date_time_ 
    ,DAYOFMONTH(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00')) AS dayEDT 
    ,MONTH(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00')) AS monthEDT 
    ,DATE_FORMAT(CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') 
    ,'%h:%i %p') AS date_timeEDT 
    FROM weblist 
    ORDER BY gmt_offset DESC; 

SELECT cl.metropolitan_area 
    ,cl.date_time 
    ,edt.date_timeEDT 
    ,DAYOFMONTH(cl.date_time) dayOrg 
    ,MONTH(cl.date_time) AS monthOrg 
    ,TIME_FORMAT(cl.date_time, '%h:%i %p') AS dateTimeOrg 
    ,DAYOFMONTH(edt.date_timeEDT) dayEDT 
    ,MONTH(edt.date_timeEDT) AS monthEDT 
    ,TIME_FORMAT(edt.date_timeEDT, '%h:%i %p') AS dateTimeEDT 
    FROM (
    SELECT 
     id 
     ,CONVERT_TZ(date_time, CONCAT(gmt_offset, ':00'), '-4:00') AS date_timeEDT 
    FROM weblist 
    ) edt 
    INNER JOIN weblist AS cl ON cl.id = edt.id 
    ORDER BY cl.gmt_offset DESC; 
+0

'WITH'在这里会非常好,除了mysql不支持它... – dancek 2011-04-07 22:13:27

回答

0

我会投多个CONVERT。我想我已经读过,mysql足够聪明地注意到它们都是一样的,所以它只会对每一行进行一次数学运算。

另外,想想当你想添加一个WHERE子句时会发生什么。你是否总是记得将它添加到weblist中的内部和外部SELECT语句中?

+0

听起来不错。谢谢你的帮助! – Eric 2011-04-08 15:29:52

2

如果您想知道哪种效率更高,请确定您将使用哪些度量标准来衡量效率,然后对其进行度量。别的只是猜测。

+1

+1只需创建一个代码,将随机时间插入到测试表中,然后选择时间以查看哪个更快。 – Johan 2011-04-07 22:51:02