我们正在计划是否更改整个数据库的时区或在所有函数和事件中使用 CONVERT_TZ。
我们决定使用 CONVERT_TZ 是否存在任何性能问题,因为考虑到它每分钟可能会转换和比较数百万行和事件?
这实际上取决于您计划在何处使用该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'
Run Code Online (Sandbox Code Playgroud)
在文字周围添加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')
Run Code Online (Sandbox Code Playgroud)
但是,如果我们将 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'
Run Code Online (Sandbox Code Playgroud)
只要 SQL 仍然引用谓词中的裸列(WHERE 子句和 ON 子句中的条件),那么在CONVERT_TZSQL 中的其他位置添加函数就不会导致显着的性能影响。