Mysql 최적화 orderby 문장의 방법 상세 설명

6611 단어 mysqlorderby
이 글 은 ORDER BY 문장의 최 적 화 를 알 게 될 것 입 니 다.그 전에 색인 에 대해 기본 적 인 이 해 를 가 져 야 합 니 다.모 르 는 남자 들 은 제 가 전에 쓴 색인 관련 글 을 먼저 볼 수 있 습 니 다.이제 시작 합 시다.
MySQL 의 두 가지 정렬 방식
1.질서 있 는 색인 순서 스 캔 을 통 해 질서 있 는 데 이 터 를 직접 되 돌려 줍 니 다.
색인 구 조 는 B+트 리 이 고 색인 에 있 는 데 이 터 는 일정한 순서에 따라 배열 되 기 때문에 정렬 조회 에서 색인 을 이용 할 수 있다 면 추가 정렬 작업 을 피 할 수 있 습 니 다.EXPLAIN 분석 조회 시 Extra 는 Using index 로 표 시 됩 니 다.
2.Filesort 정렬,되 돌아 오 는 데이터 정렬
색인 을 통 해 정렬 결 과 를 직접 되 돌려 주 는 것 이 아 닌 모든 작업 은 Filesort 정렬 입 니 다.즉,추가 정렬 작업 을 한 것 입 니 다.EXPLAIN 분석 조회 시 Extra 는 Using filesort 로 표 시 됩 니 다.
ORDER BY 최적화 의 핵심 원칙
추가 정렬 을 최소 화하 고 색인 을 통 해 질서 있 는 데 이 터 를 직접 되 돌려 줍 니 다.
ORDER BY 실전 최적화
실험 에 사용 할 customer 표 의 색인 상황:

우선 주의해 야 한다.
MySQL 검색 은 한 번 에 하나의 색인 만 사용 할 수 있 으 며,여러 필드 에 색인 을 사용 하려 면 복합 색인 을 만 듭 니 다.
ORDER BY 최적화
1.조회 필드 는 이번 조회 에 사용 할 색인 필드 와 홈 키 만 포함 하고 나머지 비 색인 필드 와 색인 필드 는 조회 필드 로 서 색인 을 사용 하지 않 습 니 다.
정렬 에 사용 할 색인 필드 만 조회 하고 색인 으로 정렬 할 수 있 습 니 다.explain select store_id,email from customer order by store_id,email;
그러나 정렬 필드 는 여러 색인 에서 색인 정렬 을 사용 할 수 없습니다.한 번 조회 할 때 하나의 색인 만 사용 할 수 있 습 니 다.explain select store_id,email,last_name from customer order by store_id,email,last_name;
정렬 에 사용 할 색인 필드 와 홈 키 만 조회 하고 색인 으로 정렬 할 수 있 습 니 다.
내 레이 션:MySQL 의 기본 InnoDB 엔진 은 물리 적 으로 색인 을 모 으 는 방식 으로 메 인 키 를 눌 러 검색 하기 때문에 InnoDB 엔진 요구 표 에는 메 인 키 가 있어 야 합 니 다.명시 적 으로 메 인 키 를 지정 하지 않 아 도 InnoDB 엔진 은 유일한 암시 적 메 인 키 를 생 성 합 니 다.즉,색인 에 반드시 메 인 키 가 있어 야 합 니 다.explain select customer_id,store_id,email from customer order by store_id,email;
정렬 에 사용 할 색인 필드 와 홈 키 이외 의 필드 를 조회 합 니 다.색인 으로 정렬 하지 않 습 니 다.explain select store_id,email,last_name from customer order by store_id,email; explain select * from customer order by store_id,email;
WHERE+ORDER BY 최적화
1.정렬 필드 는 여러 색인 에서 색인 으로 정렬 할 수 없습니다.
정렬 필드 는 여러 색인(같은 색인 이 아 님)에서 색인 으로 정렬 할 수 없습니다:explain select * from customer where last_name='swj' order by last_name,store_id;
내 레이 션:정렬 필드 가 같은 색인 에 없 을 때 B+트 리 에서 정렬 을 완료 하 는 것 에 만족 할 수 없습니다.추가 정렬 을 해 야 합 니 다.
정렬 필드 는 하나의 색인 에 있 으 며,WHERE 조건 과 ORDER BY 는 같은 색인 을 사용 하여 정렬 할 수 있 습 니 다.explain select * from customer where last_name='swj' order by last_name;
물론 조합 색인 도 색인 을 이용 하여 정렬 할 수 있다.
주의 필드 storeid,email 은 그룹 색인 에 있 습 니 다.explain select * from customer where store_id = 5 order by store_id,email;
2.정렬 필드 순서 와 색인 열 순서 가 일치 하지 않 아 색인 으로 정렬 할 수 없습니다.
내 레이 션:이것 은 조합 색인 에 대한 것 입 니 다.우 리 는 조합 색인 을 사용 할 때 가장 왼쪽 원칙 을 지 켜 야 한 다 는 것 을 알 고 있 습 니 다.WHERE 자 구 는 색인 중의 첫 번 째 열 이 있어 야 합 니 다.ORDER BY 자 구 는 이러한 요구 가 없 지만 정렬 필드 순서 와 조합 색인 열 순서 가 일치 해 야 합 니 다.우 리 는 평소에 조합 색인 을 사용 할 때,반드시 조합 색인 열 순서에 따라 쓰 는 좋 은 습관 을 길러 야 한다.
정렬 필드 순서 와 색인 열 순서 가 일치 하지 않 습 니 다.색인 을 이용 하여 정렬 할 수 없습니다.explain select * from customer where store_id > 5 order by email,store_id;
정렬 필드 순서 와 색인 열 순서 가 일치 하 는 지 확인 해 야 합 니 다.색인 을 이용 하여 정렬 할 수 있 습 니 다.explain select * from customer where store_id > 5 order by store_id,email;
ORDER BY 자 구 는 반드시 색인 중의 첫 번 째 열 을 요구 하지 않 으 며,색인 을 이용 하여 정렬 할 수 없습니다.그러나 하나의 전제조건 이 있 습 니 다.등가 여과 시 에 만 가능 합 니 다.범위 조회 시 에는 안 됩 니 다.explain select * from customer where store_id = 5 order by email; explain select * from customer where store_id > 5 order by email;
내 레이 션:

그 이 유 는 간단 하 다.범위 조회 시 첫 번 째 열 a 는 정렬 이 좋 은 것 이 고 두 번 째 필드 b 는 정렬 이 아니다.그러나 a 필드 에 같은 값 이 있 을 때 b 필드 는 정렬 된 것 입 니 다.따라서 범위 조회 라면 b 에 대해 서 만 추가 정렬 을 할 수 있 습 니 다.
3.승강 순서 가 일치 하지 않 아 색인 으로 정렬 할 수 없습니다.
ORDER BY 정렬 필드 는 모든 정렬 을 정렬 하거나 모든 정렬 을 정렬 하지 않 으 면 색인 으로 정렬 할 수 없습니다.explain select * from customer where store_id > 5 order by store_id,email; explain select * from customer where store_id > 5 order by store_id desc,email desc; explain select * from customer where store_id > 5 order by store_id desc,email asc;
요약:
위의 최 적 화 는 사실 WHERE 조건 과 ORDER BY 가 같은 색인 을 사용 하고 ORDER BY 의 순서 와 색인 순서 가 같 으 며 ORDER BY 의 필드 는 모두 오름차 또는 내림차 순 이다.그렇지 않 으 면 추가 정렬 작업 이 필요 할 것 입 니 다.Filesort 가 나타 날 것 입 니 다.
Filesort 최적화
적절 한 색인 을 만 들 면 Filesort 의 출현 을 줄 일 수 있 지만,어떤 경우 에는 Filesort 를 완전히 사라 지게 할 수 없습니다.이 때 는 Filesort 의 동작 을 가속 화 할 수 밖 에 없습니다.
Filesort 의 두 가지 정렬 알고리즘:
1.2 차 스캐닝 알고리즘
우선 조건 에 따라 정렬 필드 와 줄 포인터 정 보 를 꺼 낸 다음 정렬 구역 sort buffer 에서 정렬 합 니 다.이러한 정렬 알고리즘 은 두 번 의 데 이 터 를 방문 해 야 합 니 다.첫 번 째 는 정렬 필드 와 줄 지침 정 보 를 얻 고 두 번 째 는 줄 지침 에 따라 기록 을 얻 으 며 두 번 째 읽 기 작업 은 대량의 I/O 작업 을 초래 할 수 있 습 니 다.장점 은 정렬 할 때 메모리 비용 이 적 다 는 것 이다.
2.일차 스캐닝 알고리즘
조건 을 만족 시 키 는 줄 의 모든 필드 를 한꺼번에 꺼 낸 다음 정렬 구역 sort buffer 에서 정렬 한 후 결과 집합 을 직접 출력 합 니 다.정렬 할 때 메모리 비용 이 비교적 많 지만 정렬 효율 은 두 번 의 스캐닝 알고리즘 보다 높다.
두 가지 정렬 알고리즘 의 특성 에 따라 시스템 변 수 를 적당히 증가 maxlength_for_sort_data 의 값 은 MySQL 에서 더욱 최 적 화 된 Filesort 정렬 알고리즘 을 선택 할 수 있 습 니 다.또한 SQL 문 구 를 쓸 때 SELECT*모든 필드 가 아 닌 필요 한 필드 만 사용 하면 정렬 구역 의 사용 을 줄 이 고 SQL 성능 을 향상 시 킬 수 있 습 니 다.
총결산
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 Mysql 최적화 orderby 문장의 방법 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 여러분 에 게 답 할 것 입 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기