2010-04-08 126 views
4

以下哪项更快,还是相当? (从抓timestamp列最近期的记录)带时间戳条件的性能

SELECT UNIX_TIMESTAMP(`modified`) stamp 
FROM `some_table` 
HAVING stamp > 127068799 
ORDER BY stamp DESC 

SELECT UNIX_TIMESTAMP(`modified`) stamp 
FROM `some_table` 
WHERE UNIX_TIMESTAMP(`modified`) > 127068799 
ORDER BY `modified` DESC 

甚至另一个组合?

+0

HAVING旨在与GROUP BY子句一起使用 – jab 2010-04-08 11:25:15

回答

1

都等于和不那么好的,因为每一行的值都将被转换为timestamp

为什么不离开日期字段原样,并转换成唯一不变的价值?

WHERE `modified` > FROM_UNIXTIME(127068799) 
+0

我的印象是时间戳列在内部使用了一个整数,所以使用UNIX_TIMESTAMP没有开销。这里有人可以证实,无论哪种方式? – 2010-04-08 11:16:44

+0

刚刚注意到你也可以这样做: 'modified' + 0 – 2010-04-08 11:22:58

+0

@Tim可能是一些智能优化器会自动做这种转换,但我不会依赖这个。为什么要使用一些无声的魔法,而我们能写出简单而直接的条件呢? – 2010-04-08 11:23:59

1

只要modified被索引,这一个:

SELECT UNIX_TIMESTAMP(`modified`) stamp 
FROM `some_table` 
WHERE modified > FROM_UNIXTIME(127068799) 
ORDER BY 
     modified DESC 

是最好的解决方案,因为它是可优化搜索,并允许在modified索引使用,不像你都查询。

+0

谢谢。我看到你有关使用索引的观点。 我剩下的唯一问题是哪些转换函数的开销最小。我不太理解为什么当列在内部存储整数时使用FROM_UNIXTIME。见上面的评论主题 – 2010-04-08 11:31:24