我有一个日志表,其中有数百万行带时间戳(DATETIME)的行,我偶尔需要按日期或日期范围进行搜索。为此,我目前在时间戳列上有一个索引。
但是,我想知道是否可以将该索引的粒度降低到分钟或小时而不是秒,以此作为减小索引总体大小的一种方法。
我已经研究了前缀索引,但这些不适用于 DATETIME 列,所以我想知道是否有另一种方法可以做到这一点。如果可以大幅减少索引的大小,我很乐意在整体查询性能上进行一些交换。
DATETIME
的大小至少为 5 个字节,加上用于小数秒存储的可变数量。参考:https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html#data-types-storage-reqs-date-time
MySQL 没有代表您所描述的“四舍五入”日期时间值的数据类型。
您可以存储不带时间分量的
DATE
值,每个值 3 个字节。
或者您可以将
DATETIME
转换为 INT
值,例如 2024082217 (基于我撰写本文时的 2024-08-22 17:56:00)。这将使用每个值 4 个字节。
老实说,我不会担心。随着数据存储的发展,
DATETIME
已经相当紧凑了。
如果您发现这导致了问题,请增加存储空间以适应您需要的数据,或者存储更少的数据行。
通常不值得花费大量精力进行微观优化,因为它们会导致您的项目变得更加复杂并且更容易出现错误。这不是一个好的权衡,因为额外 100 美元的存储空间可以更轻松地解决问题。