MIN / MAX 대 ORDER BY 및 LIMIT


101

다음 쿼리 중 더 나은 방법을 고려할 수있는 방법은 무엇입니까? 당신의 이유는 무엇입니까 (코드 효율성, 더 나은 유지 보수성, 덜 WTFery) ...

SELECT MIN(`field`)
FROM `tbl`;

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;

답변:


129

인덱싱되지 않은 필드를보고있는 최악의 경우를 사용 MIN()하려면 테이블 전체를 한 번만 통과해야합니다. 사용 SORT하고 파일 LIMIT정렬이 필요합니다. 큰 테이블에 대해 실행하면 감지 된 성능에 상당한 차이가있을 수 있습니다. 의미없는 데이터 포인트로, MIN()동안 .36s했다 SORTLIMIT내 dev에 서버에 106,000 행 테이블에 대해 .84s했다.

그러나 인덱싱 된 열을보고있는 경우 차이를 알아 채기가 더 어렵습니다 (두 경우 모두 의미없는 데이터 포인트는 0.00s). 좋아하지만, 보이는, 설명의 출력을 보면 MIN()단순히 반면 인덱스 ( '선택 테이블이 멀리 최적화'와 'NULL'행)에서 가장 작은 값을 뽑을 수 SORTLIMIT여전히 인덱스의 정렬 된 탐색을 할 필요를 필요 (106,000 행). 실제 성능에 미치는 영향은 미미할 수 있습니다.

마치 MIN()길을 가야하는 것입니다 - 더 빨리 최악의 경우의, 최선의 경우 구별, 표준 SQL과 가장 명확하게 당신이 얻을하려는 값을 표현한다. mson이 언급했듯이 SORT및 사용하는 LIMIT것이 바람직한 것으로 보이는 유일한 경우 는 임의의 열에서 상위 또는 하위 N 값을 찾는 일반 작업을 작성하고 특수한 경우 작업을 작성할 가치가 없습니다.


7
o (n) 단일 패스 대 0 (nlogn) 정렬
Abhishek Iyer

1
@AbhishekIyer 당신이 전적으로 옳지 만 "인덱스되지 않은 필드의 최악의 경우"를 추가합니다.
dmikam

인덱싱되지 않은 최악의 경우에 대한 부분은 잘못되었습니다. 항상 전체 스캔이 필요합니다. 최소 또는 최대인지 어떻게 알 수 있습니까? 그것은 당신이 스캔하는 것과 같지 않고 값은 "이봐, 당신은 마침내 나를 찾았습니다! 나는 잭, 최대!"라고 비명을 질렀습니다.
Robo Robok

4 억 7 천만 행이있는 인덱싱 된 테이블을 사용한 테스트에서 두 쿼리 모두 0.00 초가 걸립니다. 그러나 쿼리에 "WHERE field2 = x"필터를 추가하면 LIMIT가있는 쿼리는 여전히 0.00 초가 걸리고 MIN이있는 쿼리는 0.21 초가 걸립니다.
Antonio Cañas Vargas

13
SELECT MIN(`field`)
FROM `tbl`;

ANSI와 호환되기 때문입니다. 제한 1은 TOP이 SQL Server에 해당하므로 MySql에만 해당됩니다.


대부분의 DBMS에는 제한 / 오프셋 또는 이와 동등한 기능이 있으며 내가 작업 한 대부분의 앱에서 사용됩니다 (MIN의 대안이 아니라 페이지 매김과 같은 다른 용도로 사용됩니다.)
finnw

@finnw-동의하지만 질문자의 예는 한계를 min과 명시 적으로 비교했습니다.
Otávio Décio

9

으로 MSON숀 McSomething이 뾰족한 아웃이, MIN이 바람직하다.

ORDER BY + LIMIT가 유용한 또 다른 이유는 MIN 열이 아닌 다른 열의 값을 가져 오려는 경우입니다.

예:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1

4

대답은 당신이하는 일에 달려 있다고 생각합니다.

일회성 쿼리가 있고 의도가 지정한대로 간단하다면 min (field)를 선택하는 것이 좋습니다.

그러나 이러한 유형의 요구 사항은 일반적으로 상위 n 개 결과 획득, n 번째-m 번째 결과 획득 등으로 변경됩니다.

나는 당신이 선택한 데이터베이스를 커밋하는 것이 너무 끔찍한 생각이라고 생각하지 않습니다. dbs 변경은 가볍게 만들어서는 안되며 수정해야하는 것은이 이동을 할 때 지불하는 가격입니다.

나중에 느끼거나 느끼지 못할 고통 때문에 지금 자신을 제한하는 이유는 무엇입니까?

가능한 한 ANSI를 유지하는 것이 좋다고 생각하지만 이는 단지 지침 일뿐입니다.


3

허용 가능한 성능이 주어지면 의미 상 의도에 더 가깝기 때문에 첫 번째 것을 사용합니다.
성능이 문제라면 (대부분의 최신 옵티마이 저는 동일한 쿼리 계획에 대해 둘 다 최적화 할 것입니다. 비록이를 확인하기 위해 테스트해야하지만) 물론 더 빠른 것을 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.