首页 > 解决方案 > 使用 CONVERT_TZ 会导致性能问题?

问题描述

我们正在计划是否更改整个数据库的时区或在我们所有的函数和事件中使用 CONVERT_TZ。

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

标签: mysqlsql

解决方案


这实际上取决于您计划在哪里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'

在文字周围添加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 仍然引用谓词中的列(WHERE 子句和 ON 子句中的条件),那么CONVERT_TZ在 SQL 的其他位置添加函数应该不会对性能造成重大影响。


推荐阅读