Indexed Lookups from TIMESTAMP Columns

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: UTC值存储在`TIMESTAMP`列中,在插入和检索时根据会话时区与UTC进行转换。若会话时区采用夏令时,可能导致本地时区的值不是唯一的,影响查询结果。无索引查询在会话时区中进行比较,可能返回多个匹配值;有索引查询则按UTC比较,可能仅返回一个匹配值。为确保返回所有匹配值,可使用`IGNORE INDEX`提示禁用索引。此外,使用`FROM_UNIXTIME()`和`UNIX_TIMESTAMP()`也可能遇到类似问题,请参考第12.7节了解详情。

时间值作为UTC值存储在TIMESTAMP列中,插入TIMESTAMP栏和从TIMESTAMP栏内检索的值在会话时区和UTC之间转换。(这与CONVERT_TZ()函数执行的转换类型相同。如果会话时区为UTC,则实际上没有时区转换。)
由于当地时区更改的惯例,如夏令时(DST),UTC和非UTC时区之间的转换在两个方向上不是一一对应的。不同的UTC值在另一个时区可能不不同。以下示例显示了在非UTC时区中变得相同的不同UTC值:

image.png

image.png

您可以看到,当转换为“MET”时区时,这两个不同的UTC值是相同的。对于给定的TIMESTAMP列查询,这种现象可能会导致不同的结果,具体取决于优化器是否使用索引来执行查询。
假设一个查询使用WHERE子句从前面显示的表中选择值,在ts列中搜索单个特定值,例如用户提供的时间戳文字:

image.png

进一步假设查询在以下条件下执行:
会话时区不是UTC,而是夏令时。例如:

image.png

由于夏令时偏移,存储在TIMESTAMP列中的唯一UTC值在会话时区中不是唯一的。(前面显示的示例说明了这是如何发生的。)
该查询指定了一个搜索值,该值在会话时区中进入夏令时的小时内。
在这些条件下,WHERE子句中的比较对于非索引和索引查找以不同的方式发生,并导致不同的结果:
如果没有索引或优化器无法使用它,则会在会话时区中进行比较。优化器执行表扫描,检索每个ts列值,将其从UTC转换为会话时区,并将其与搜索值(也在会话时区中解释)进行比较:

image.png

由于存储的ts值被转换为会话时区,因此查询可以返回两个与UTC值不同但在会话时区中相等的时间戳值:一个值发生在时钟更改时的夏令时转换之前,另一个值出现在夏令时切换之后。
如果有可用的索引,则以UTC进行比较。优化器执行索引扫描,首先将搜索值从会话时区转换为UTC,然后将结果与UTC索引条目进行比较:

image.png

在这种情况下,(转换后的)搜索值仅与索引条目匹配,并且由于不同存储的UTC值的索引条目也是不同的,因此搜索值只能匹配其中一个。
由于非索引和索引查找的优化器操作不同,查询在每种情况下都会产生不同的结果。非索引查找的结果返回会话时区中匹配的所有值。索引查找不能这样做:
它在存储引擎内执行,存储引擎只知道UTC值。
对于映射到相同UTC值的两个不同会话时区值,索引查找仅匹配相应的UTC索引条目,并仅返回一行。
在前面的讨论中,存储在tstable中的数据集恰好由不同的UTC值组成。在这种情况下,所有使用所示形式的索引查询最多只匹配一个索引条目。
如果索引不是唯一的,则表(和索引)可以存储给定UTC值的多个实例。例如,ts列可能包含UTC值“2018-10-28 00:30:00”的多个实例。在这种情况下,使用查询的索引将返回它们中的每一个(在结果集中转换为MET值'2018-10-28 02:30:00')。使用索引的查询将转换后的搜索值匹配到UTC索引条目中的单个值,而不是匹配转换为会话时区中搜索值的多个UTC值,这仍然是正确的。
如果返回会话时区中匹配的所有ts值很重要,解决方法是使用IGNORE index提示禁止使用索引:

image.png
在其他情况下也会出现双向时区转换缺乏一对一映射的情况,例如使用FROM_UNIXTIME()和UNIX_TIMESTAMP()函数执行的转换。见第12.7节“日期和时间函数”。

相关文章
|
SQL Oracle 关系型数据库
Oracle查询优化-计算字符在字符串中出现的次数
【2月更文挑战第3天】【2月更文挑战第7篇】只接上SQL
362 0
|
8月前
|
NoSQL MongoDB 开发者
Python与MongoDB的亲密接触:从入门到实战的代码指南
本文详细介绍了Python与MongoDB结合使用的实战技巧,涵盖环境搭建、连接管理、CRUD操作、高级查询、索引优化、事务处理及性能调优等内容。通过15个代码片段,从基础到进阶逐步解析,帮助开发者掌握这对黄金组合的核心技能。内容包括文档结构设计、批量操作优化、聚合管道应用等实用场景,适合希望高效处理非结构化数据的开发者学习参考。
392 0
|
7月前
|
存储 机器学习/深度学习 Java
Java 大视界 -- Java 大数据在智慧水利水资源调度与水情预测中的应用创新(180)
本文探讨了Java大数据技术在智慧水利中的创新应用,重点分析了其在水资源调度与水情预测中的关键技术与实践案例。通过大数据存储、实时处理与深度学习模型,Java有效提升了水利数据管理效率与水情预测准确性,助力传统水利向智能化转型。
|
6月前
|
存储 监控 数据可视化
开源数据管理工具的差异化定位:Grafana 与 MyEMS 在能源监控领域的技术路径与价值边界
在工业数字化与能源智能化趋势下,Grafana 与 MyEMS作为代表性开源工具,分别以“数据可视化”和“能源全链路管理”为核心,功能、场景与架构差异显著。本文从技术与实践角度深度对比两者,助力企业精准选型。
194 2
|
12月前
|
JSON API UED
商品信息API接口的设计与实现
商品信息API接口的设计与实现,遵循RESTful原则以确保高效、可维护和良好的用户体验。API支持获取、查询、创建、更新和删除商品资源,URL模式直观易懂。请求参数通过查询字符串传递,支持分页和过滤。响应体结构化,包含数据、链接和元数据字段,便于解析。错误处理采用HTTP状态码结合JSON错误描述,提供明确反馈。
|
监控 UED
跨部门协作中的任务协调:上级管理者的高效方法
在现代企业中,跨部门协作至关重要,但常因职能差异、信息不对称和沟通不畅导致任务分配不明确、资源浪费。上级管理者需充当战略目标传达者、任务协调者、信息共享推动者及冲突调解者,通过明确职责、建立协作机制、优化信息流程、引入高效工具等策略,避免重复劳动,提升组织效率。
1056 15
|
机器学习/深度学习 人工智能 监控
利用AI提升代码质量:现代开发者的利器
【10月更文挑战第4天】在软件开发中,代码质量是项目成功的关键。本文探讨了如何利用AI提升代码的可读性、可维护性和性能。AI可通过代码审查自动化、自动化测试、性能优化和安全漏洞检测等多种方式帮助开发者。具体实践步骤包括选择合适的AI工具、集成工具、训练模型以及持续监控改进。实际应用案例如SonarQube、DeepCode等展示了AI在现代开发中的巨大潜力,预示着AI将在未来软件开发中扮演更重要角色。
|
存储 自然语言处理
LangChain-04 RAG Retrieval-Augmented Generation 检索增强生成
LangChain-04 RAG Retrieval-Augmented Generation 检索增强生成
228 3
|
人工智能 API 数据中心
NVIDIA破局第二曲线创新问题之Megatron Core的定义如何解决
NVIDIA破局第二曲线创新问题之Megatron Core的定义如何解决
370 0
|
存储 运维 Serverless
函数计算产品使用问题之如何规避因提高CPU规格而导致的内存规格不必要增加的问题
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
238 0