MySQL이 정렬을 처리하는 방법에 대해 이야기해 보겠습니다.

이 기사는 Huawei Cloud 커뮤니티에서 공유되었습니다. " MySQL은 정렬을 어떻게 처리하나요? ⭐️정렬해야 하는 쿼리를 최적화하는 방법은 무엇입니까?" ", 저자: Caicai의 백엔드 개인 주방.

머리말

이 두 키워드는 MySQL 쿼리에 자주 사용 됩니다. order by  group by 

공통점은 모두 필드를 정렬한다는 것입니다. 그러면 쿼리 문의 정렬은 어떻게 구현됩니까?

사용된 쿼리 문을 정렬해야 하는 두 가지 처리 상황이 있습니다.

  1. 현재 레코드는 본질적으로 정렬되어 있으므로 정렬할 필요가 없습니다.
  2. 현재 레코드가 순서를 유지하지 않아 정렬이 필요합니다.

순서를 보장하기 위해 인덱스 사용

첫 번째 경우, 보조 인덱스의 인덱스 열 순서는 결과 집합의 순서를 보장하는 데 자주 사용되므로 정렬이 필요하지 않습니다.

테이블 a의 경우 a2에 대한 보조 인덱스를 생성하면 a2가 보조 인덱스에 정렬됩니다.

테이블 `a` 생성(
   `a1` int(11) NOT NULL AUTO_INCREMENT,
   `a2` varchar(255) 문자 집합 utf8mb4 기본 NULL,
   `a3` varchar(255) 기본 NULL,
   기본 키(`a1`),
   키 `idx_a2` (`a2`)
 ) 엔진=InnoDB AUTO_INCREMENT=76 기본 CHARSET=utf8;

select * from a order by a.a2 limit 10

옵티마이저가 a2 인덱스를 사용하기로 선택하면 a2 열의 레코드 자체가 정렬되므로 정렬을 위해 다른 오버헤드를 사용할 필요가 없습니다.

이미지.png

물론 옵티마이저는 a2 인덱스를 사용하지 않을 수도 있습니다. (옵티마이저는 a2를 사용하여 테이블을 반환하는 것이 너무 비싸다고 판단하면 전체 테이블 스캔을 사용하게 됩니다.)

이미지.png

a2가 옵티마이저가 사용하는 인덱스에서 순서가 잘못된 경우 결과는 다른 방법으로 정렬됩니다.

파일 정렬

실행 계획의 추가 정보가 나타나면 sort_buffer를 사용하여 결과를 정렬합니다. Using filesort 

sort_buffer는 정렬에 사용되는 메모리입니다. sort_buffer는 쿼리에 필요한 모든 필드를 저장할 수도 있고 정렬해야 하는 필드와 기본 키만 저장할 수도 있습니다.

show variables like 'max_length_for_sort_data'

쿼리에 필요한 필드의 길이가 1 미만인 경우 쿼리에 필요한 모든 필드가 sort_buffer에 들어간 후 정렬이 필요한 열이 정렬되고 최종적으로 결과가 반환됩니다. max_length_for_sort_data 

이미지.png

쿼리에 필요한 필드의 길이가 필드의 길이보다 큰 경우 정렬이 필요한 필드와 기본 키 값만 sort_buffer에 넣은 후 클러스터형 인덱스를 쿼리하여 해당 값을 얻습니다. 정렬 후 쿼리해야 하는 열(테이블로 한 번 더 반환되는 것과 동일) max_length_for_sort_data 

이미지.png

sort_buffer에서 정렬할 때 메모리가 충분하면 메모리에서 정렬이 수행됩니다. 메모리가 충분하지 않으면 디스크의 임시 파일을 사용하여 정렬을 지원합니다.

정렬을 지원하기 위해 임시 파일이 사용되는지 확인하려면 이 기능을 켜십시오 . optimizer_trace 

#옵티마이저 추적 활성화
 SET Optimizer_trace='enabled=on';
 #sql문
 학생 이름 제한 10000으로 학생 순서에서 *를 선택합니다.
 #옵티마이저가 추적한 정보 보기
 SELECT * FROM `information_schema`.`OPTIMIZER_TRACE`\G;

정렬에 사용되는 알고리즘은 병합 알고리즘입니다. 먼저 여러 개의 작은 파일로 나누어 정렬한 다음 병합합니다.

어디에 number_of_tmp_files 사용된 임시 파일의 수와 sort_buffer_size sort_buffer의 크기가 있습니까?

이미지.png

따라서 order by, group by 등 정렬이 필요한 키워드를 사용할 때에는 적절한 인덱스를 설정하는 것이 가장 좋습니다.

데이터의 양이 적으면 정렬 버퍼에서 정렬할 수 있습니다. 데이터의 양이 너무 많으면 디스크와 상호 작용해야 합니다.

요약하다

쿼리문을 정렬해야 하는 경우에는 정렬이 없는 경우와 정렬이 필요한 경우의 두 가지 상황으로 구분됩니다.

사용된 인덱스가 순서대로 되어 있으면 정렬할 필요가 없으며 인덱스를 통해 순서가 보장됩니다.

사용된 인덱스가 잘못된 경우 sort_buffer를 사용하여 쿼리 필드의 길이가 제한을 초과하지 않으면 sort_buffer의 각 레코드에 쿼리해야 하는 열이 저장됩니다.

제한을 초과하면 sort_buffer는 정렬이 필요한 열과 기본 키 값만 저장합니다. 정렬 후 기본 키 값을 사용하여 쿼리해야 하는 열을 가져오는 테이블을 반환합니다.

데이터의 양이 너무 많아 메모리에 정렬할 수 없는 경우 디스크 페이지를 사용하여 정렬을 보조하고 병합 알고리즘을 사용하여 정렬된 데이터를 여러 페이지로 분산시킨 후 병합합니다.

추적 최적화 프로그램 Optimizer_trace를 통해 콘텐츠를 분석하여 보조 페이지 수 및 기타 정보를 볼 수 있습니다.

디스크 페이지 지원 정렬을 사용하지 않도록 정렬해야 하는 열에 대해 적절한 인덱스를 생성합니다.

인덱싱을 사용할 수 없는 경우 정렬 버퍼 또는 max_length_for_sort_data를 조정할 수 있습니다(주의).

화웨이 클라우드의 신기술에 대해 빨리 알아보고 팔로우하려면 클릭하세요~

Microsoft의 중국 AI 팀은 수백 명의 사람들을 모아 미국으로갔습니다. 알려지지 않은 오픈 소스 프로젝트는 얼마나 많은 수익을 가져올 수 있습니까? Huawei는 공식적으로 Yu Chengdong의 위치가 화중 과학 기술 대학의 오픈 소스 미러 스테이션 으로 조정되었다고 발표했습니다. 사기꾼들이 TeamViewer를 사용해 외부 네트워크 접속을 공식적으로 개시했습니다 ! 원격 데스크톱 공급업체는 무엇을 해야 합니까? 최초의 프런트 엔드 시각화 라이브러리이자 Baidu의 유명한 오픈 소스 프로젝트 ECharts의 창립자 - "바다에 나간" 유명한 오픈 소스 회사의 전직 직원이 소식을 전했습니다. 리더는 격노하고 무례하게 행동하여 임신한 여성 직원을 해고했습니다. OpenAI는 AI가 포르노 콘텐츠를 생성하도록 허용하는 것을 고려했습니다. Microsoft는 Rust Foundation에 100만 달러를 기부했다고 보고했습니다. 여기서 time.sleep(6)의 역할은 무엇입니까? ?
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/4526289/blog/11138574