我需要选择 CST 当天的所有记录,但是表中的时间戳字段都是 GMT/UTC。
服务器的时区是GMT。
根据 MySQL Workbench,获取 GMT 当天的所有记录非常快,大约需要 0.031 秒,对于添加了 -6 的视图,大约需要 40 秒。
我尝试过一些
CAST(CONVERT_TZ(`CallLog`.`gmtDateTime`, '+00:00', '-06:00') AS DATE) = CAST(CONVERT_TZ(NOW(), '+00:00', '-06:00') AS DATE)
gmtDateTime
是一个时间戳,所以也许可以用它来做一些事情?
我相信它慢的原因是左手表达式是针对表中的每条记录计算的并且无法缓存(不过这是一个猜测,对MySQL的内部结构不是很熟悉)
显而易见的解决方案是将 CST 时间添加为列并基于此进行过滤,但不幸的是,这不是一个选项,因为我们无法控制填充表的软件,并且不想修改表本身的架构。
正如您所指出的,它很可能必须转换每行的 gmtDateTime 并进行全表扫描。
删除
gmtDateTime
的转换,并选择使用基于NOW()
的上下限时间戳。您的 WHERE
状况将如下所示:
gmtDateTime BETWEEN
CONVERT_TZ(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'), '+00:00', '-06:00') AND
CONVERT_TZ(DATE_FORMAT(NOW(), '%Y-%m-%d 23:59:59'), '+00:00', '-06:00');