Alex Asked: 2011-12-11 05:03:09 +0800 CST2011-12-11 05:03:09 +0800 CST 2011-12-11 05:03:09 +0800 CST 按 DATETIME 排序比按 TIMESTAMP 慢? 772 我有一个 DATETIME 键,我在其上对结果进行排序,查询运行速度很慢。如果我将其更改为 TIMESTAMP 会运行得更快吗? 因为我注意到按编号键排序几乎是立即完成的。 mysql database-design 3 个回答 Voted Best Answer RolandoMySQLDBA 2011-12-11T18:07:42+08:002011-12-11T18:07:42+08:00 您可以通过索引某些列来缩短查询的运行类型。 由于您提到了对 DATETIME 字段进行排序,因此绕过临时表结果排序的最佳方法之一是使用覆盖索引,其中包含 DATETIME 作为您需要的任何给定复合索引的最后一列。 我知道这是完全可能的,因为在Ronald Bradford 的有关 Covering Indexes 的链接中,他列出了他将提供的未来主题列表。这是该列表: 此处未讨论的有关索引的一些未来主题包括: 使用唯一索引 NULL 列和值对索引的影响 通过使用索引<<<---- 消除文件排序(请注意) 索引过多的影响 索引基数 shantanuo 2011-12-16T06:12:24+08:002011-12-16T06:12:24+08:00 datetime 消耗 8 个字节,而 timestamp 消耗 4 个字节。因此查询会更快,因为索引大小会更小。除此之外,时间戳的范围比日期时间小,因此默认情况下可以称为优化数据类型。 但我不确定它会更快。可能是 5% 或 10% ? 最后你可能会发现,改变数据类型的所有努力都不值得! Stephen Turner 2011-12-11T06:26:54+08:002011-12-11T06:26:54+08:00 正如评论中向我指出的那样,这主要与 SQL Server 相关,而不是问题标签所要求的 MySql。 在 SQL 服务器上,时间戳是一个特殊的列,也称为行版本。它是一个全局计数器,每当更新一行时,rowversion 就会增加 1,并针对更新的行进行记录。它没有记录时间。 这意味着它会在每次更新时发生变化,这使得它成为一个糟糕的密钥候选者。 如果需要在行时自动更新的列,则不需要存储时间,而只需存储更新的顺序,则可以使用它。 无论使用哪种服务器,它都可以稍微提高性能,您必须对其进行测量并查看,但与添加索引相比几乎没有影响。
您可以通过索引某些列来缩短查询的运行类型。
由于您提到了对 DATETIME 字段进行排序,因此绕过临时表结果排序的最佳方法之一是使用覆盖索引,其中包含 DATETIME 作为您需要的任何给定复合索引的最后一列。
我知道这是完全可能的,因为在Ronald Bradford 的有关 Covering Indexes 的链接中,他列出了他将提供的未来主题列表。这是该列表:
datetime 消耗 8 个字节,而 timestamp 消耗 4 个字节。因此查询会更快,因为索引大小会更小。除此之外,时间戳的范围比日期时间小,因此默认情况下可以称为优化数据类型。
但我不确定它会更快。可能是 5% 或 10% ?
最后你可能会发现,改变数据类型的所有努力都不值得!
正如评论中向我指出的那样,这主要与 SQL Server 相关,而不是问题标签所要求的 MySql。
在 SQL 服务器上,时间戳是一个特殊的列,也称为行版本。它是一个全局计数器,每当更新一行时,rowversion 就会增加 1,并针对更新的行进行记录。它没有记录时间。
这意味着它会在每次更新时发生变化,这使得它成为一个糟糕的密钥候选者。
如果需要在行时自动更新的列,则不需要存储时间,而只需存储更新的顺序,则可以使用它。
无论使用哪种服务器,它都可以稍微提高性能,您必须对其进行测量并查看,但与添加索引相比几乎没有影响。