MySQL 인덱스 최적화 (2 개)


작은 테이블이 큰 테이블을이 끕니다

여기에 사진 설명 삽입

ORDER BY 최적화

시뮬레이션 데이터

create table tblA(
#id int primary key not null auto_increment,
age int,
birth timestamp not null
);

insert into tblA(age, birth) values(22, now());
insert into tblA(age, birth) values(23, now());
insert into tblA(age, birth) values(24, now());

create index idx_A_ageBirth on tblA(age, birth);

실행 계획보기

사례 A

EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY age
EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY age,birth
EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY birth
EXPLAIN SELECT * FROM tblA WHERE age > 20 ORDER BY birth,age
EXPLAIN SELECT * FROM tblA WHERE birth > '2021-02-19 22:45:00' ORDER BY birth
EXPLAIN SELECT * FROM tblA WHERE birth > '2021-02-19 22:45:00' ORDER BY age

여기에 사진 설명 삽입

사례 B

EXPLAIN SELECT * FROM tblA ORDER BY age ASC,birth DESC 

여기에 사진 설명 삽입

결론적으로

  • MySQL은 색인 및 파일 정렬의 두 가지 방법을 지원합니다. 인덱스는 매우 효율적이며 스캔 인덱스 자체가 정렬되고 파일 정렬이 비효율적임을 의미합니다.
  • ORDER BY 절, 인덱스를 사용하여 정렬하고 파일 정렬을 피하십시오.
  • ORDER BY 절은 두 가지 조건을 만족하며 인덱스 정렬이 사용됩니다. 하나는 ORDER BY 절이 최상의 왼쪽 접두사 규칙을 채택하고 다른 하나는 where 조건 필드와 ORDER BY 절을 결합하여 최상의 왼쪽 접두사를 충족시키는 것입니다. 규칙.
    정렬 및 그룹화 최적화

MySQL 정렬 알고리즘

Using filesort가 발생하면 MySQL은 자체 알고리즘에 따라 쿼리 결과를 정렬합니다.

양방향 정렬

  • MySQL 4.1 이전에는 양방향 정렬이 사용되었습니다. 문자 그대로 디스크를 두 번 스캔하고 마지막으로 데이터를 가져오고 행 포인터와 열 순서를 읽고 정렬 한 다음 정렬 된 목록을 스캔하고 다시 시작하는 것을 의미합니다. 목록의 값에 따라 데이터. 목록에서 해당 데이터 출력을 읽습니다.
  • 디스크에서 정렬 필드를 가져 와서 버퍼에서 정렬 한 다음 디스크에서 다른 필드를 가져옵니다.
    간단히 말해서 데이터 배치를 가져 오려면 디스크를 두 번 스캔해야합니다. 우리 모두 알고 있듯이 I \ O는 시간이 많이 걸리므로 mysql4에서 1 이후에 두 번째로 개선 된 알고리즘이 나타 났는데, 이는 단방향 정렬입니다.

편도 정렬

  • 디스크에서 질의에 필요한 모든 열을 읽고 열 순서에 따라 버퍼에 정렬 한 다음 정렬 된 목록을 검색하여 출력합니다. 더 빠르고 데이터를 두 번 읽지 않습니다. 그리고 임의 IO를 순차적 IO로 바꾸지 만 각 행을 메모리에 저장하기 때문에 더 많은 공간을 사용합니다.

문제

  • sort_buffer에서 method B는 method B가 모든 필드를 취하기 때문에 method B보다 훨씬 많은 공간을 차지하므로 추출 된 데이터의 전체 크기가 sort_buffer의 용량을 초과하여 sort_buffer의 크기 만 발생할 수 있습니다. 데이터 매번., 정렬 (tmp 파일 생성, 다중 채널 병합)을 수행하고, 정렬 후 sort_buffer 용량을 취하고, 다시 정렬합니다. 따라서 여러 I / O가 발생합니다. 즉, 하나의 I / O 작업을 저장하고 싶었지만 많은 I / O 작업이 발생했지만 이득은 손실의 가치가 없었습니다.

최적화하는 방법

  • sort_buffer_size매개 변수 설정 증가

    어떤 알고리즘을 사용하든이 매개 변수를 개선하면 효율성이 향상됩니다. 물론이 매개 변수는 각 프로세스에 대해 1M-8M 사이에서 조정되기 때문에 시스템의 능력에 따라 개선되어야합니다.

  • max_length_for_sort_data매개 변수 설정 증가

    단방향 정렬을 사용하는 mysql의 전제는 정렬 된 필드의 크기가 max_length_for_sort_data 보다 작다는 것 입니다.이 매개 변수를 늘리면 개선 된 알고리즘을 사용할 확률이 높아집니다.

    그러나 너무 높게 설정하면 총 데이터 용량이 sort_buffer_size를 초과 할 가능성이 대신 증가하여 고주파 디스크 I / O낮은 프로세서 사용률이 발생 합니다. (1024-8192 사이에서 조정 됨)
    요약

  • 선택 후 쿼리 필드 줄이기 (덜 선택 * 사용)

    쿼리 필드 수가 줄어들면 버퍼에 더 많은 콘텐츠가 포함될 수 있으며 이는 sort_buffer_size 를 간접적으로 늘리는 것과 같습니다.

요약 A

여기에 사진 설명 삽입

요약 B

여기에 사진 설명 삽입

GROUP BY 최적화

GROUP BY 최적화는 대략 ORDER BY와 유사합니다.
여기에 사진 설명 삽입

  • 정렬 할 때 인덱스를 사용하고 파일 정렬 사용을 피하려면 인덱스 적용 범위를 사용할 수 있습니다.
  • ORDER BY / GROUP BY 뒤의 필드 순서는 복합 색인의 순서와 정확히 동일해야합니다.
  • ORDER BY / GROUP BY 뒤의 색인은 순서대로 나타나야하며 뒤의 색인은 나타나지 않을 수 있습니다.
  • 오름차순 또는 내림차순을 수행하려면 필드의 정렬 순서가 일치해야합니다. 오름차순의 일부가 아님, 내림차순의 일부, 오름차순 또는 모두 내림차순
  • 복합 색인 앞의 필드가 필터 조건에 상수로 나타나는 경우 정렬 필드는 바로 다음 필드가 될 수 있습니다.

추천

출처blog.csdn.net/single_0910/article/details/113873323