我们正在计划是更改整个数据库的时区,还是在所有功能和事件中使用CONVERT_TZ。
是否存在性能问题,我们决定使用CONVERT_TZ时会考虑到它可能每分钟转换和比较数百万行和事件吗?
答案 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
函数会对性能产生重大影响。