使用CONVERT_TZ是否会导致性能问题?

时间:2018-10-11 15:09:22

标签: mysql sql

我们正在计划是更改整个数据库的时区,还是在所有功能和事件中使用CONVERT_TZ。

是否存在性能问题,我们决定使用CONVERT_TZ时会考虑到它可能每分钟转换和比较数百万行和事件吗?

1 个答案:

答案 0 :(得分:2)

这实际上取决于您打算使用CONVERT_TZ函数的位置

例如,如果将其包装在WHERE子句中的一列中,则将禁用MySQL使用索引范围扫描操作的功能。这可能会对性能产生重大影响,或导致“性能问题”。

例如,如果此查询使用对以mydatetime为前导列的索引进行索引范围扫描,则仅从大海捞针中抽了几针:

 SELECT t.foo
   FROM my_huge_table t
  WHERE t.mydatetime >= '2018-10-09 14:30'
    AND t.mydatetime <  '2018-10-09 15:15'

literals 周围添加CONVERT_TZ函数不会导致性能问题。性能将相同:

 SELECT t.foo
   FROM my_huge_table t
  WHERE t.mydatetime >= CONVERT_TZ('2018-10-09 08:30','EST5EDT','UTC')
    AND t.mydatetime <  CONVERT_TZ('2018-10-09 09:15','EST5EDT','UTC')

但是,如果我们将WHERE子句中的列包装在一个函数中,这将强制MySQL对该函数求值,然后进行比较,这将对表中的行执行一次

不要不要执行此操作:

 SELECT t.foo
   FROM my_huge_table t
  WHERE CONVERT_TZ(t.mydatetime,'UTC','EST5EDT') >= '2018-10-09 08:30'
    AND CONVERT_TZ(t.mydatetime,'UTC','EST5EDT') <  '2018-10-09 09:15'

只要SQL仍在谓词中引用 bare 列(WHERE子句和ON子句中的条件),则不应在SQL的其他位置添加CONVERT_TZ函数会对性能产生重大影响。