我有一个简单的保存日志:
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)(除了在日志中)更有效率,所以我可以直接获取它们,只在用户查看日志时明确要求更多的日志..
答案 0 :(得分:2)
不,引擎不会检查抱歉,错过了这个但是如果有十亿个记录具有相同的XiD会发生什么?。是的,引擎将检查ORDER BY
的所有记录。它将检查WHERE
子句返回的所有记录。ORDER BY
子句的所有记录。 Here is the order of operations, as explained by Ben Nadel:
- FROM clause
- WHERE子句
- GROUP BY子句
- HAVING条款
- SELECT条款
- ORDER BY子句
醇>
恕我直言,我认为没有更好的方法来提取单一的最新记录。
答案 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