时间戳为int字段,查询性能

时间:2010-04-29 15:08:52

标签: mysql performance

我将时间戳存储为int字段。在大型表上,在日期插入行需要很长时间,因为我使用的是mysql函数FROM_UNIXTIME。

SELECT * FROM table WHERE FROM_UNIXTIME(timestamp_field, '%Y-%m-%d') = '2010-04-04'

有没有办法加快这个查询?也许我应该使用timestamp_field >= x AND timestamp_field < y来查询行?

谢谢


已编辑此查询效果很好,但您应该在timestamp_field 上处理索引。

SELECT * FROM table WHERE 
timestamp_field >= UNIX_TIMESTAMP('2010-04-14 00:00:00')
AND timestamp_field <= UNIX_TIMESTAMP('2010-04-14 23:59:59')

2 个答案:

答案 0 :(得分:3)

对列上的常量而不是FROM_UNIXTIME使用UNIX_TIMESTAMP

SELECT * FROM table
WHERE timestamp_field
   BETWEEN UNIX_TIMESTAMP('2010-04-14 00:00:00')
       AND UNIX_TIMESTAMP('2010-04-14 23:59:59')

这可以更快,因为它允许数据库使用列timestamp_field上的索引(如果存在)。当您在列上使用非sargable函数(如FROM_UNIXTIME)时,数据库无法使用索引。

如果您在timestamp_field上没有索引,请添加一个索引。

完成此操作后,您还可以选择所需的列,而不是使用SELECT *来尝试进一步提高性能。

答案 1 :(得分:0)

如果你能够,将日期存储为正确的日期时间字段会更快,或者在运行查询的代码中,将之后的日期转换为unix时间戳,然后再将其发送到查询。

FROM_UNIXTIME必须转换表中的每条记录才能检查它,正如您所看到的那样,它会出现性能问题。使用与查询中实际使用的最接近的本机数据类型,或使用列的数据类型查询,是最快的方法。

所以,如果你需要继续使用int字段,那么是的,在严格整数上使用<>会大大提高性能,假设你把东西存储到第二个,而不是那天中午的时间戳。