mysql - 使用 CONVERT_TZ 会导致性能问题?
问题描述
我们正在计划是否更改整个数据库的时区或在我们所有的函数和事件中使用 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'
在文字周围添加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 的其他位置添加函数应该不会对性能造成重大影响。
推荐阅读
- python - 使用一个列表理解和两个条件对列表重新排序
- r - 按分解组在另一列中重复匹配值
- python - 如何修复 11、12 和 13 以“th”结尾
- android - Android:一种在一个地方交替 UI 元素的简单方法
- mysql - 向 MySQL 查询添加额外的子查询
- python - 程序有效,但我仍然收到 NoneType 错误 Python Decorators
- r - 转置和导出后无法重新导入 .csv 文件
- python - 如何重新排序前 n 个数据框列,并在最后添加剩余的列?
- php - 如何在 PHP 中的每个数组对象中删除空格后的所有内容?
- flutter - Flutter - 在所有子项的右侧创建带有滚动条的可滚动 ListView