两个SQL查询具有相同的结果,但一个更快一个数量级

时间:2014-01-21 17:08:56

标签: mysql sql performance

我想知道为什么第一个查询比第二个查询快得多。 它运行在大约500k记录的表格上。

SELECT date  FROM `log` WHERE `action` = 'SOMETHING' and token = 167  ORDER BY id DESC LIMIT 1;  
-- 0.0003 sec

SELECT max(date)  FROM `log` WHERE `action` = 'SOMETHING' and token = 167; 
-- 0.0023 sec

4 个答案:

答案 0 :(得分:0)

我的猜测是你在日期上没有索引,但DO有一个id(主键)索引?

如果id是主键,它可以对数据进行排序,以便更快地返回结果。这是因为即使您的查询只返回一个日期列,这些行也按ID进行ORDERED,这被编入索引,允许非常快速地订购500k行。

要返回最大日期,即使其单行的一行...如果日期未编入索引,数据库也需要检查每条行记录以确定哪一行最大。

答案 1 :(得分:0)

两个查询都可以使用log(action, token, id)上的索引快速运行。

要了解这两个查询之间的效果差异,请为其提供explain计划。您可以通过使用explain

进行查询来获得此结果
explain SELECT date  FROM `log` WHERE `action` = 'SOMETHING' and token = 167  ORDER BY id DESC LIMIT 1;  

explain SELECT max(date)  FROM `log` WHERE `action` = 'SOMETHING' and token = 167; 

答案 2 :(得分:0)

第一个命令对表进行排序并带来第一个记录。第二个命令虽然没有排序,但db需要读取整个表以找出哪个是最高记录。您的表可能没有字段日期的索引

答案 3 :(得分:0)

这两个查询是非常不同的逻辑,尽管它们可能返回相同的值,因为id和日期之间的相关性对你有意义,但查询优化器显然无法知道。

使用(操作,令牌,日期)索引,优化器可能能够更快地执行第二个查询,但如果您完全确定该关联,则使用第一个查询没有任何问题。