最新更改:ORDER BY时间戳DESC LIMIT 1 - 高效?

时间:2011-06-22 12:02:31

标签: mysql performance timestamp limit

我有一个简单的保存日志:

XiD (INT) what was saved  
UiD (INT) who done it  
TiD (TIMESTAMP) CURRENT_TIMESTAMP  

使用主键中的所有三个字段 - 使其唯一。

我想告诉用户只有最新的日志行(直到她要求更多):

SELECT UiD,TiD FROM log WHERE XiD=? ORDER BY TiD DESC LIMIT 1  

但如果有十亿条记录具有相同的XiD会发生什么呢? 以上是效率还是MySql-server会检查所有记录(对于ORDER BY)
  - 如果是这样的话:如何使用最少的服务器卡路里提取这样的日志的单个最新记录?

PS:我还没有实现任何东西,所以任何替代方案都是可能的:)

编辑:
也许只是直接在XiD记录的字段中存储(覆盖)who和when(UiD + TiD)(除了在日志中)更有效率,所以我可以直接获取它们,只在用户查看日志时明确要求更多的日志..

3 个答案:

答案 0 :(得分:2)

  1. 不,引擎不会检查ORDER BY的所有记录。它将检查WHERE子句返回的所有记录。抱歉,错过了这个但是如果有十亿个记录具有相同的XiD会发生什么?。是的,引擎将检查ORDER BY子句的所有记录。 Here is the order of operations, as explained by Ben Nadel

      
        
    1. FROM clause
    2.   
    3. WHERE子句
    4.   
    5. GROUP BY子句
    6.   
    7. HAVING条款
    8.   
    9. SELECT条款
    10.   
    11. ORDER BY子句
    12.   
  2. 恕我直言,我认为没有更好的方法来提取单一的最新记录。

答案 1 :(得分:1)

你需要在XiD ASC,TiD DESC上做索引才能做到这一点。 由于UiD不在查询的where子句中,并且TiD在索引中的UiD之后,因此不能用于排序(在解释查询结果中由filesort指示)

答案 2 :(得分:0)

如果你的'XID'列有'* AUTO_INCREMENT *'你可以使用:

SELECT UiD,TiD FROM log WHERE XiD=LAST_INSERT_ID() ORDER BY TiD DESC LIMIT 1

参考:MySQL Manual