我想知道为什么第一个查询比第二个查询快得多。 它运行在大约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
答案 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和日期之间的相关性对你有意义,但查询优化器显然无法知道。
使用(操作,令牌,日期)索引,优化器可能能够更快地执行第二个查询,但如果您完全确定该关联,则使用第一个查询没有任何问题。