mysql ORDER BY
과 함께 사용되는 하위 쿼리 내 에서 절 을 사용하면 절이 UNION
최적화됩니다 ORDER BY
.
기본적으로 a UNION
는 순서가 지정되지 않은 목록을 반환하므로 an ORDER BY
은 아무 작업도 수행하지 않기 때문입니다.
최적화는 문서에 언급 되어 있으며 다음 과 같이 말합니다.
ORDER BY 또는 LIMIT를 개별 SELECT에 적용하려면 SELECT를 묶는 괄호 안에 절을 넣으십시오.
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
그러나 개별 SELECT 문에 ORDER BY를 사용하는 것은 UNION이 기본적으로 정렬되지 않은 행 집합을 생성하기 때문에 최종 결과에 행이 나타나는 순서에 대해 아무런 의미가 없습니다. 따라서이 컨텍스트에서 ORDER BY를 사용하는 것은 일반적으로 LIMIT와 함께 사용되므로 SELECT에 대해 검색 할 선택된 행의 하위 집합을 결정하는 데 사용됩니다. 최종 UNION 결과. SELECT에서 LIMIT없이 ORDER BY가 표시되면 어쨌든 효과가 없기 때문에 최적화됩니다.
이것의 마지막 문장은 효과가 있어야하기 때문에 약간 오해의 소지가 있습니다. 이 최적화는 서브 쿼리 내에서 주문해야하는 상황에있을 때 문제를 일으 킵니다.
MySQL이이 최적화를 수행하지 않도록 강제하려면 다음과 같이 LIMIT 절을 추가 할 수 있습니다.
(SELECT 1 AS rank, id, add_date FROM my_table WHERE distance < 5 ORDER BY add_date LIMIT 9999999999)
UNION ALL
(SELECT 2 AS rank, id, add_date FROM my_table WHERE distance BETWEEN 5 AND 15 ORDER BY rank LIMIT 9999999999)
UNION ALL
(SELECT 3 AS rank, id, add_date from my_table WHERE distance BETWEEN 5 and 15 ORDER BY id LIMIT 9999999999)
높음 LIMIT
은 OFFSET
페이지 매김과 같은 작업을 수행하려는 경우 전체 쿼리에을 추가 할 수 있음을 의미합니다 .
이는 또한 ORDER BY
각 유니온에 대해 서로 다른 열을 사용할 수 있다는 추가 이점을 제공합니다 .