我将时间戳存储为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')
答案 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字段,那么是的,在严格整数上使用<
和>
会大大提高性能,假设你把东西存储到第二个,而不是那天中午的时间戳。