首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ES系列之一文带你避开日期类型存在的坑

概述 时间相关的字段是ElasticsSearch(以下简称ES)最常用的字段了,几乎所有的索引应用场景都会有时间字段,一般用于基于时间范围的搜索,聚合等场景。...坑一,日期字段映射问题 我们知道ES有个Dynamic Mapping的机制,当索引不存在或者索引中的某些字段没有设置mapping属性,index的时候ES会自动创建索引并且根据传入的字段内容自动推断字段的格式...,在ES里查看索引的mapping发现,timeData字段居然被识别成了Long型。...这两段的意思是说,在ES内部默认使用UTC时间并且是以毫秒时间戳的long型存储的。针对日期字段的查询其实对long型时间戳的范围查询。...此外在使用Java Client聚合查询日期的时候,也需要注意时区问题,最好是指定时区进行搜索或者聚合。

6.9K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀

    ,则是在UTC的基础上增加八小时时间戳在进行存储时,先根据当前时区转换成UTC,再转换成int类型进行存储时间戳在进行读取时,先将int类型转换为UTC,再转换为当前时区当前时区指的是MySQL服务端本地时区...存储时间戳使用整形来存储,只是存储、读取会将时间戳转换为当前时区的时间其实我们还可以通过整形自己进行存储,比如使用int直接存储时间戳但由于int整形只有4B(时间范围有限),在未来可能无法进行存储时间...,就需要其他方案解决为了避免空间太小,可以直接使用bigint 8B进行存储使用整形存储时间戳不需要转换成时区,因此没有转换的性能开销,但无法显示时间、可读性不好,可以由我们自由进行时区转换适合国际化千万数据测试为了比较...datetime、timestamp、bigint的性能,我们需要先搭建环境案例只测试innodb存储引擎有索引的情况,想测试其他情况的同学,可以使用以下脚本函数自由测试首先拿出一个快过期的云服务器,然后在服务器上启动...、日期、时间时,可以使用year、date、time,尽量使用少的空间datetime性能不错,方便可视化,固定时间,可以在不追求性能、方便可视化、不涉及时区的场景使用timestamp性能较差,存储时间戳

    44422

    【Elasticsearch专栏 14】深入探索:Elasticsearch使用Logstash的日期过滤器删除旧数据

    当处理时间序列数据时,日期过滤器尤其有用。通过配置日期过滤器,可以指定日期字段的名称和格式,然后使用这个字段来比较事件的时间戳与当前时间。...,这里使用了日期格式化 query => '{"query": {"range": {"timestamp": {"lte": "now-30d"}}}}' # 查询条件,筛选时间戳早于30天前的文档...query参数定义了筛选条件,这里使用了range查询来筛选出时间戳字段timestamp早于当前时间减去30天的文档。...在filter部分,使用date过滤器来解析timestamp字段,并将其转换为统一的日期格式。然后,移除了Logstash自带的@timestamp字段,因为已经有自己的时间戳字段。...注意时区问题:日期过滤器和滚动查询中的时间计算可能会受到时区设置的影响。确保Logstash和Elasticsearch的时区设置正确,并且与你的业务需求一致。

    31210

    记一次在线跨集群迁移ES数据

    : 源集群(5.6.4)的.kibana索引也被同步到6.4.3版本的新集群了,造成不兼容,需要在新集群中删除掉.kibana索引 源集群中的日志时间戳字段@timestamp是增加了+08:00时区后缀的...,经过上述迁移后,同步到新集群中的日志数据中@timestamp没有了时区后缀,这个问题在logstash侧进行了尝试没有解决,所以通过在es侧增加ingest pipeline进行解决: "description...记录新集群中当天索引中数据的最新时间戳 存量的旧的索引不会再写入了,而当天的索引还在持续写入,在步骤2的全量同步数据完成之后(logstash执行完毕后会自动终止进程), 需要查询出当天索引的数据中已经同步完成的最新的时间戳..."sort": [ { "@timestamp": "desc" } ] } 记执行上述查询获取到的时间戳为start. 4.增量迁移当天的索引 使用logstash增量迁移当天的索引...记录开始迁移的时间 在新的集群中执行以下查询,记录开始进行增量迁移的时间戳: GET es-runlog-2019-11-20/_search { "query": { "range":

    4.1K146

    mysql基础知识(7)

    时区转换原则:MySQL数据库中的时区转换基于存储和计算的时间戳以UTC(协调世界时)为基准的原则。数据在存储和显示时会根据时区进行转换。...如何进行时区转换使用CONVERT_TZ函数:CONVERT_TZ函数是MySQL中用于时区转换的主要函数,它接受三个参数:要转换的时间戳、原始时区、目标时区。...注意事项时区命名:不同的系统和数据库可能使用不同的时区命名方式,需要注意进行转换。数据存储格式:在插入和查询数据时,需要确保使用正确的日期和时间格式。...right join 右连接,在两张表进行连接查询时,会返回右表所有的行,即使在左表中没有匹配的记录。说一下数据库的三大范式第一范式:数据表中的每一列(每个字段)都不可以再拆分。...还可以考虑分批删除数据,以减少对系统资源的占用和避免长时间的锁表。优化删除操作使用索引:在删除操作的WHERE条件中使用索引可以显著提高删除速度。确保在需要删除的列上建立了合适的索引。

    7411

    掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南

    char和varcharchar存储固定字符,当存储字符长度未满时使用空格填充,因此它无法存储末尾空格,在修改时它能够在原记录上进行修改varchar相当于char空间换时间的版本,它是可变长字段会多使用...性能竟然相差30%时间类型的选择根据越小越好原则,只需要年、日期、时间时选择year、date、time需要详细日期时可以选择datetime和时间戳的方式datetime固定时间、无时区、可视化较好timestamp...时间戳,有时区(根据服务端时区)、有时间范围限制、使用系统时区并发下性能没那么好、可视化不好使用整形存储时间戳,性能好,可以自由转换时区,可视化不好不考虑时区、可视化要好大部分场景下可以使用datetime...考虑时区(需要自由转换时区)、追求性能、不注重可视化可以选择整形存储时间戳(无符号int 目前够用)具体内容感兴趣的同学可以查看这篇文章:时间类型该如何选择?...,只有当a相等时b才有序where a>=1 and b使用上索引中a、b两个列where a>=1 and c使用上索引中的a,由于b没有查询条件导致c不一定有序,于是c无法使用索引但是在

    66731

    能避开很多坑的mysql面试题,你知道吗?

    2038年以后的时间,是无法用timestamp类型存储的。 但是它有一个优势,timestamp类型是带有时区信息的。一旦你系统中的时区发生改变,例如你修改了时区,该字段的值会自动变更。...显然,存储时间范围更大。但是它坑的地方在于,它存储的是时间绝对值,不带有时区信息。如果你改变数据库的时区,该项的值不会自己发生变更!...bigint,也是8个字节,自己维护一个时间戳,查询效率高,不过数据写入,显示都需要做转换。 7:为什么不直接存储图片、音频、视频等大容量内容? 我们在实际应用中,都是文件形式存储的。...,因为索引已经排序,其指定的范围是连续的;在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。...12:mysql联合索引 联合索引是两个或更多个列上的索引。对于联合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部分,但只能是最左侧部分。

    2K20

    MySQL关于时间设置的注意事项

    时间类型的字段 MySQL时间类型字段: ?...默认情况下,每个连接的当前时区是服务器的时间。时区可以在每个连接的基础上设置。只要时区设置保持不变,就会返回所存储的相同值。如果存储一个时间戳值,然后更改时区并检索该值,则检索到的值与存储的值不同。...出现这种情况是因为没有在两个方向上使用相同的时区进行转换。当前时区可以作为time_zone系统变量的值。 ?...在任何情况下,为列赋值为NULL都不会将其设置为当前时间戳。 使用NOT NULL属性显式声明且没有显式默认属性的时间戳列被视为没有默认值。对于未为此类列指定显式值的插入行,结果取决于SQL模式。...设置会话时区会影响时区敏感的时间值的显示和存储。这包括NOW()或CURTIME()等函数显示的值,以及存储在时间戳列中的值和从时间戳列检索到的值。

    1.9K20

    面试官:MySQL表设计要注意什么?

    一旦你系统中的时区发生改变,例如你修改了时区 SET TIME_ZONE = "america/new_york"; 你会发现,项目中的该字段的值自己会发生变更。...但是它坑的地方在于,他存储的是时间绝对值,不带有时区信息。如果你改变数据库的时区,该项的值不会自己发生变更!...(4)bigint,也是8个字节,自己维护一个时间戳,表示范围比timestamp大多了,就是要自己维护,不大方便。 问题7:为什么不直接存储图片、音频、视频等大容量内容?...主要原因有如下两点 (1)Mysql内存临时表不支持TEXT、BLOB这样的大数据类型,如果查询中包含这样的数据,在排序等操作时,就不能使用内存临时表,必须使用磁盘临时表进行。...因此,不推荐使用text和blob类型! 问题8:字段为什么要定义为NOT NULL?

    1.6K20

    一个MySQL时间戳精度引发的血案

    考虑到我负责的应用中,有个功能需要用到类似下面这种SQL,即使用时间戳作为查询的条件,查询在某个时间戳之后的所有数据。 ?...编写测试代码,先插入一条数据,然后用时间戳作为查询条件去查询,代码如下: ? 运行单测,如我们的设想,确实是没有查询出数据来,结果如下: ?...DATETIME类型在MySQL中是以“YYYYMMDDHHMMSS”格式的整数存放的,与时区无关,使用8个字节的空间; TIMESTAMP类型可以保存的时间范围要小很多,显示的值依赖时区,MySQL的服务器...一般情况下推荐使用DATETIME作为时间戳字段,不推荐使用bigint类型来存储时间。...在开发中,应该尽量避免使用时间戳作为查询条件,如果必须要用,则需要充分考虑MySQL的精度和查询参数的精度等问题。

    2.9K20

    时间戳,这样用就对了

    前言: 时间戳字段在MySQL中经常使用到,比如需要记录一行数据创建的时间或修改的时间时,我们通常会使用时间戳即timestamp字段。...本篇文章主要介绍timestamp字段的使用方法及相关参数,希望大家读完能对timestamp有更深的认识。...MySQL存储timestamp时间戳时,存入数据库的实际是UTC的时间,查询显示时会根据具体的时区来显示不同的时间。...程序jdbc连接串建议指定时区并与数据库保持一致。 总结: 本篇文章详细介绍了timestamp的用法,对于影响时间戳的几个参数,我们也简单做了介绍。...timestamp时间戳使用实践及相关建议希望对你有所帮助,其实这些内容在官方文档中都有记录,大家有事没事可以多翻阅官方文档哦。

    1.1K30

    MySQL 保存日期,用哪种数据类型合适?datetime?timestamp?还是 int?

    使用字符串存储日期,第一个显而易见的问题就是无法使用 MySQL 中提供的日期函数,这会为很多查询带来不便。...❝例如用户表中有一个字段 birthday,表示用户的生日,现在想要查询 2001 出生的所有用户,如果 birthday 是 日期类型,就可以使用 YEAR 函数,但是如果 birthday 是字符串类型...2.3 底层存储 TIMESTAMP 类型最大的优势在于自带时区属性,因为它本质上是从毫秒转化而来。...如果你的业务需要对应不同的国家时区,那么类型 TIMESTAMP 是一种不错的选择,TIMESTAMP 类型字段的值会随着服务器时区的变化而变化,自动换算成相应的时间,说简单点就是在不同时区,查询到同一个条记录此字段的值会不一样...3. int 字符串费空间,TIMESTAMP 和 DATETIME 如果没有吃透则总感觉乱乱的,所以也有人存时间戳,存一个 int 类型的数值,用一个时间戳来表示时间。

    1.9K20

    设计数据库中常见的规范

    1:N关系的设计 大字段 分库分表 命名规范 数据库表名,字段名,索引名等都要命名规范,可读性高 表名,字段名必须使用小写字母或者数字,禁止使用数字开头,禁止使用拼音,一般还不使用英文缩写 主键索引名为...如果一张表的字段过多,表中保存的数据可能就会很大,查询效率就会低 当表的字段数很多时,可以将表分为俩张表,一张作为条件查询表,一张作为详细内容 尽可能使用not null 定义字段 如果没有特殊的理由...NULL 值有可能会导致索引失效 如果将字段默认设置成一个空字符串或常量值并没有什么不同,且都不会影响到应用逻辑,那就可以将这个字段设置为 NOT NULL 评估哪块要加索引 首先,评估表的数据量,如果数据量只有几十行...否则设计表的时候,如果有查询条件的字段,一般就要加索引 索引使用的注意事项: 索引不要建的太多,一般单索引个数不要超过5个 去分度不高的字段,不能加索引,如:性别 索引建立完成后,还是要避免索引失效的情况...time:表示时间值 datetime:表示日期时间值,跟时区无关 timestamp:表示时间戳值,跟时区有关 year:年份值 推荐使用datetime来保存日期和时间,存储范围更大,且和时区无关

    1.6K91

    SQL函数 GETUTCDATE

    由于UTC时间在地球上的任何地方都是相同的,不依赖于当地时区,也不受当地时差(如夏令时)的影响,因此当不同时区的用户访问同一数据库时,此函数对于应用一致的时间戳非常有用。...如果当前UTC时间戳是在没有上下文的情况下提供的,则此时间戳值以TIMESTAMP数据类型格式返回。例如,SELECT GETUTCDATE()。...要更改默认日期时间字符串格式,请使用带有各种日期和时间选项的set option命令。 GETUTCDATE的典型用法是在SELECT语句SELECT列表或查询的WHERE子句中。...在设计报表时,可以使用GETUTCDATE在每次生成报表时打印当前日期和时间。GETUTCDATE对于跟踪活动也很有用,比如记录事务发生的时间。...请注意,除GETUTCDATE外,所有 SQL时间戳函数都特定于本地时区设置。要获得通用的当前时间戳(独立于时区),还可以使用ObjectScript $ZTIMESTAMP特殊变量。

    97430

    MongoDB基础之BSON数据类型

    这样就能用内容对数组进行查询和构建索引了。 MongoDB可以使用原子更新修改数组中的内容。 值的集合或者列表可以表示成数组。...时间戳、机器ID和进程ID组合起来,提供了秒级别的唯一性。时间戳在前,意味着ObjectId大致会按照插入的顺序排序。可以将其作为索引提高效率,但不是绝对的,只是大致。...如果使用错误,就会导致日期和字符串混淆,字符串和日期不能互相匹配,最终会给删除、更新、查询等很多操作带来问题。 shell中的日期显示时使用本地时区设置。...shell将数据库里的符号类型转换成字符串。现在已经过时。 13、Timestamp(时间戳) BSON有一个MongoDB内部使用的特殊的时间戳类型,和常的日期类型没有关系。...在复制中,操作日志具有一个ts字段。该字段中的值反映了使用BSON时间戳值的操作时间。 注意时间戳类型只是在MongoDB内部使用。开发过程中使用的是日期类型。

    9.4K30

    MySQL库表设计小技巧

    前言: 在我们项目开发中,数据库及表的设计可以说是非常重要,我遇到过很多库表设计比较杂乱的项目,像表名、字段名命名混乱、字段类型设计混乱等等,此类数据库后续极难维护与拓展。...timestamp翻译为汉语即"时间戳",它是当前时间到 Unix元年(1970 年 1 月 1 日 0 时 0 分 0 秒)的秒数,占用4个字节,而且是以UTC的格式储存,它会自动检索当前时区并进行转换...记录本行数据的插入时间和修改时间建议使用timestamp。 和时区相关的时间字段选用timestamp。...如果timestamp字段经常用于查询,我们还可以使用MySQL内置的函数FROM_UNIXTIME()、UNIX_TIMESTAMP(),将日期和时间戳数字来回转换,转换后可以用 INT UNSIGNED...存储时间,数字是连续的,占用空间更小,并且可以使用索引提升查询性能。

    2.8K31

    MongoDB基础之BSON数据类型

    这样就能用内容对数组进行查询和构建索引了。 MongoDB可以使用原子更新修改数组中的内容。 值的集合或者列表可以表示成数组。...时间戳、机器ID和进程ID组合起来,提供了秒级别的唯一性。时间戳在前,意味着ObjectId大致会按照插入的顺序排序。可以将其作为索引提高效率,但不是绝对的,只是大致。...如果使用错误,就会导致日期和字符串混淆,字符串和日期不能互相匹配,最终会给删除、更新、查询等很多操作带来问题。 shell中的日期显示时使用本地时区设置。...shell将数据库里的符号类型转换成字符串。现在已经过时。 13、Timestamp(时间戳) BSON有一个MongoDB内部使用的特殊的时间戳类型,和常的日期类型没有关系。...在复制中,操作日志具有一个ts字段。该字段中的值反映了使用BSON时间戳值的操作时间。 注意时间戳类型只是在MongoDB内部使用。开发过程中使用的是日期类型。

    4.2K10

    一次使用InfluxDB数据库的总结

    第一次的方案 第一次是很简单的,就是mysql建索引,在时间戳和其余两个条件查询比较多的字段建索引,然后最近一天的数据是存放到redis缓存当中的, 一开始感觉还是不错的,所以查询实时的数据还是挺快的...,查询历史数据因为有索引的关系,所以速度也还可以。...], time()), //最后一个为时间戳 ]; //写入数据, 第一个参数为写入的数据,第二个参数为时间戳的精度,这里我们使用秒精度 $database->writePoints...因为数据保存的时候InfluxDB是按照自己的格式存储的,如果要用秒时间戳作为条件查询,就要这样写啦, 在api文档里面有说明 api文档的快捷入口:https://docs.influxdata.com...Y-m-d H:i:s,然后再拿这个时间去不同时区的机器那里查询。

    2K40

    MySQL 给你问懵了?50 道 MySQL 高频面试题详解来了

    它用来压缩 MyISAM 表,这减少了磁盘或内存使用。 MyISAM Static 和 MyISAM Dynamic 有什么区别? 在 MyISAM Static 上的所有字段有固定宽度。...每当行被更改时,时间戳字段将获取当前时间戳。 列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况? 它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。...UNIX_TIMESTAMP 是从 MySQL 时间戳转换为 Unix 时间戳的命令 FROM_UNIXTIME 是从 Unix 时间戳转换为 MySQL 时间戳的命令 11、列对比运算符是什么?...Timestamp:以时间戳格式存储,占用 4 个字节,范围小 1970-1-1 到 2038-1-19,显示依赖于所指定得时区,默认在第一个列行的数据修改时可以自动得修改timestamp 列得值 Date...(3)为数据表建立索引的原则有哪些? 在最频繁使用的、用以缩小查询范围的字段上建立索引。 在频繁使用的、需要排序的字段上建立索引 (4)什么情况下不宜建立索引?

    2.7K11
    领券