다음 쿼리 중 더 나은 방법을 고려할 수있는 방법은 무엇입니까? 당신의 이유는 무엇입니까 (코드 효율성, 더 나은 유지 보수성, 덜 WTFery) ...
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
답변:
인덱싱되지 않은 필드를보고있는 최악의 경우를 사용 MIN()
하려면 테이블 전체를 한 번만 통과해야합니다. 사용 SORT
하고 파일 LIMIT
정렬이 필요합니다. 큰 테이블에 대해 실행하면 감지 된 성능에 상당한 차이가있을 수 있습니다. 의미없는 데이터 포인트로, MIN()
동안 .36s했다 SORT
및 LIMIT
내 dev에 서버에 106,000 행 테이블에 대해 .84s했다.
그러나 인덱싱 된 열을보고있는 경우 차이를 알아 채기가 더 어렵습니다 (두 경우 모두 의미없는 데이터 포인트는 0.00s). 좋아하지만, 보이는, 설명의 출력을 보면 MIN()
단순히 반면 인덱스 ( '선택 테이블이 멀리 최적화'와 'NULL'행)에서 가장 작은 값을 뽑을 수 SORT
와 LIMIT
여전히 인덱스의 정렬 된 탐색을 할 필요를 필요 (106,000 행). 실제 성능에 미치는 영향은 미미할 수 있습니다.
마치 MIN()
길을 가야하는 것입니다 - 더 빨리 최악의 경우의, 최선의 경우 구별, 표준 SQL과 가장 명확하게 당신이 얻을하려는 값을 표현한다. mson이 언급했듯이 SORT
및 사용하는 LIMIT
것이 바람직한 것으로 보이는 유일한 경우 는 임의의 열에서 상위 또는 하위 N 값을 찾는 일반 작업을 작성하고 특수한 경우 작업을 작성할 가치가 없습니다.
SELECT MIN(`field`)
FROM `tbl`;
ANSI와 호환되기 때문입니다. 제한 1은 TOP이 SQL Server에 해당하므로 MySql에만 해당됩니다.
으로 MSON 와 숀 McSomething이 뾰족한 아웃이, MIN이 바람직하다.
ORDER BY + LIMIT가 유용한 또 다른 이유는 MIN 열이 아닌 다른 열의 값을 가져 오려는 경우입니다.
예:
SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
대답은 당신이하는 일에 달려 있다고 생각합니다.
일회성 쿼리가 있고 의도가 지정한대로 간단하다면 min (field)를 선택하는 것이 좋습니다.
그러나 이러한 유형의 요구 사항은 일반적으로 상위 n 개 결과 획득, n 번째-m 번째 결과 획득 등으로 변경됩니다.
나는 당신이 선택한 데이터베이스를 커밋하는 것이 너무 끔찍한 생각이라고 생각하지 않습니다. dbs 변경은 가볍게 만들어서는 안되며 수정해야하는 것은이 이동을 할 때 지불하는 가격입니다.
나중에 느끼거나 느끼지 못할 고통 때문에 지금 자신을 제한하는 이유는 무엇입니까?
가능한 한 ANSI를 유지하는 것이 좋다고 생각하지만 이는 단지 지침 일뿐입니다.