2010-01-02 2 views

ответ

6

Это во многом зависит от оптимизатора запросов в реализации SQL. В лучшем случае они будут иметь одинаковую производительность. Как правило, однако, первый запрос потенциально намного быстрее.

Первый запрос, по существу, просит СУБД проверить каждое значение в someIntColumn и выбрать самый большой.

Второй запрос просит СУБД отсортировать все значения в someIntColumn от самых больших до самых маленьких и выбрать первый. В зависимости от количества строк в таблице и наличия (или отсутствия) индекса в столбце это может быть значительно медленнее.

Если оптимизатор запросов достаточно сложный, чтобы понять, что второй запрос эквивалентен первому, вам повезло. Но если вы перенастроете приложение на другую СУБД, вы можете получить неожиданно низкую производительность.

+2

Я согласен с этим. MAX() дает СУБД четкую цель и возможность использовать любую оптимизацию, которая имеет место для этого случая (скажем, супербыстрый «макс» поиск, который обновляется, только если столбец вставлен выше). Вторая команда сложнее понять систему в ее намерениях и, возможно, более трудно оптимизировать. –

0

EDIT на основе объяснить план:

Объяснить план показывает, что 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

+0

Да, действительно. myISAM очень эффективен при возврате итоговых результатов из индексированных столбцов; он сохраняет сводные данные применимым образом. –

Смежные вопросы