MySQL의 ORDER BY FIELD ()는 내부적으로 어떻게 작동합니까 이해합니다 . 내가

ORDER BY절의 작동 방식과 FIELD()함수의 작동 방식을 이해합니다 . 내가 이해하고 싶은 것은 두 가지가 함께 작동하여 정렬하는 방법입니다. 행은 어떻게 검색되고 정렬 순서는 어떻게 파생됩니까?

+----+---------+
| id |  name   |
+----+---------+
|  1 | stan    |
|  2 | kyle    |
|  3 | kenny   |
|  4 | cartman |
+----+---------+ 

SELECT * FROM mytable WHERE id IN (3,2,1,4) ORDER BY FIELD(id,3,2,1,4)

위의 쿼리는

+----+---------+
| id |  name   |
+----+---------+
|  3 | kenny   |
|  2 | kyle    |
|  1 | stan    |
|  4 | cartman |
+----+---------+ 

ORDER BY 3, 2, 1, 4와 비슷한 말

질문

  • 내부적으로 어떻게 작동합니까?
  • MySQL은 어떻게 행을 가져오고 정렬 순서를 계산합니까?
  • MySQL은 id 열을 기준으로 정렬해야한다는 것을 어떻게 알 수 있습니까?


답변

기록을 위해

SELECT * FROM mytable WHERE id IN (1,2,3,4) ORDER BY FIELD(id,3,2,1,4);

WHERE절의 목록을 주문할 필요가 없기 때문에 잘 작동합니다.

작동 방식은

  • FIELD () 는 검색하려는 값이 존재하는 경우 쉼표로 구분 된 목록의 색인 위치를 반환하는 함수입니다.

  • ORDER BY값이 무엇에 의해 평가 분야 () 반환

모든 종류의 멋진 주문을 만들 수 있습니다

예를 들어 IF () 함수 사용

SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0),FIELD(id,3,2,1,4);

이렇게하면 처음 4 개의 ID가 목록의 맨 위에 나타나고 그렇지 않으면 맨 아래에 나타납니다. 왜?

에서 ORDER BY0 또는 1을 얻습니다.

  • 첫 번째 열이 0이면 처음 4 개의 ID 중 하나가 나타나도록합니다
  • 첫 번째 열이 1이면 나중에 표시하십시오.

첫 번째 열에서 DESC로 뒤집어 봅시다

SELECT * FROM mytable
WHERE id IN (1,2,3,4)
ORDER BY IF(FIELD(id,3,2,1,4)=0,1,0) DESC,FIELD(id,3,2,1,4);

에서 ORDER BY여전히 0 또는 1을 얻습니다.

  • 첫 번째 열이 1이면 첫 번째 4 개의 ID 이외의 것을 표시하십시오.
  • 첫 번째 열이 0이면 처음 4 개의 ID가 원래 순서대로 표시됩니다.

실제 질문

이것에 대해 내부를 심각하게 원한다면 , 책의 189 쪽과 192쪽으로 가십시오

실제 심해 다이빙.

본질적으로 ORDER *order( ORDER BY식 트리) 라는 C ++ 클래스가 있습니다. 에서가 JOIN::prepare, *order라는 함수에 사용됩니다 setup_order(). 수업 중간에 왜 JOIN? 모든 쿼리, 단일 테이블에 대한 쿼리조차도 항상 JOIN으로 처리됩니다 (내 게시물 참조 JOIN 조건과 WHERE 조건 사이에 실행 차이가 있습니까? )

이 모든 소스 코드는 sql/sql_select.cc

분명히 ORDER BY나무는에 대한 평가를 보유 할 것입니다 FIELD(id,3,2,1,4). 따라서 숫자 0,1,2,3,4는 관련된 행을 참조하면서 정렬되는 값입니다.


답변

어쩌면 이것은 실제 코드와 너무 멀어서 원하는 수준에서 충분히 낮지 않을 것입니다.

MySQL이 인덱스를 사용하여 정렬 된 순서로 데이터를 검색 할 수없는 경우 선택한 모든 열과 추가 데이터가있는 임시 테이블 / 결과를 생성합니다. 그중 하나는 각 행의 ORDER BY 표현식 값 결과를 저장하는 일종의 열입니다. 그런 다음이 tmp 테이블을 정렬 할 열이 포함 된 “filesort”루틴으로 보냅니다. 그런 다음 행이 정렬 순서대로 정렬되어 하나씩 열을 선택하고 선택한 열을 반환 할 수 있습니다.