子查询与运行函数的效率有几次?

时间:2011-04-07 22:08:34

标签: mysql sql database

我有以下两个查询,我想知道做什么更有效: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;

2 个答案:

答案 0 :(得分:2)

如果您想知道哪个更有效,请确定您将使用哪些指标来衡量效率,然后衡量它们。其他任何东西都在猜测。

答案 1 :(得分:0)

我投票支持多个CONVERT。我想我已经读过mysql非常聪明,注意到它们都是一样的,所以它只会对每一行进行一次数学计算。

另外,考虑一下想要添加WHERE子句时会发生什么。您是否总是记得将其添加到weblist中的内部和外部SELECT语句?

相关问题