2010-01-02 162 views
2

这些语句之间是否有任何有形的差异(速度/效率)?假设该列已编入索引。基于解释计划获取列的最大值

SELECT MAX(someIntColumn) AS someIntColumn 

SELECT someIntColumn ORDER BY someIntColumn DESC LIMIT 1 

回答

6

这很大程度上取决于SQL实现中的查询优化器。充其量,他们将会有相同的表现。然而,通常情况下,第一个查询可能要快得多。

第一个查询基本上要求DBMS检查someIntColumn中的每个值并选择最大的一个。

第二个查询要求DBMS将someIntColumn中的所有值从最大到最小排序并选取第一个。根据表中行的数量和列上索引的存在(或缺少),这可能会明显变慢。

如果查询优化器足够复杂以至于意识到第二个查询与第一个查询相当,那么您很幸运。但是,如果您将应用重新定位到其他DBMS,则可能会出现意外的糟糕表现。

+2

我同意这一点。 MAX()为DBMS提供了一个明确的目标,并且有机会在这种情况下使用它的任何优化(例如,只有列插入更高时才会更新的超快速“最大”查找)。第二个命令对于系统理解其意图更难,并且可能更难以优化。 – 2010-01-02 17:58:18

0

编辑:

解释计划显示max(column)是更有效的。解释计划说,“Select tables optimized away”

EXPLAIN SELECT version from schema_migrations order by version desc limit 1; 
+----+-------------+-------------------+-------+---------------+--------------------------+---------+------+------+-------------+ 
| id | select_type | table    | type | possible_keys | key      | key_len | ref | rows | Extra  | 
+----+-------------+-------------------+-------+---------------+--------------------------+---------+------+------+-------------+ 
| 1 | SIMPLE  | schema_migrations | index | NULL   | unique_schema_migrations | 767  | NULL | 1 | Using index | 
+----+-------------+-------------------+-------+---------------+--------------------------+---------+------+------+-------------+ 
1 row in set (0.00 sec) 

EXPLAIN SELECT max(version) FROM schema_migrations ; 
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra      | 
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ 
| 1 | SIMPLE  | NULL | NULL | NULL   | NULL | NULL | NULL | NULL | Select tables optimized away | 
+----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ 
1 row in set (0.00 sec) 
+0

对,假设我应该澄清,这只是为了检索单列值。 – Thody 2010-01-02 17:46:06

+0

是的。 myISAM真正快速地返回来自索引列的汇总结果;它以可用的方式维护汇总数据。 – 2010-01-02 21:08:02