>  기사  >  데이터 베이스  >  내 MySQL 쿼리가 \'인덱스 사용, 임시 사용, 파일 정렬 사용\'을 사용하는 이유는 무엇입니까?

내 MySQL 쿼리가 \'인덱스 사용, 임시 사용, 파일 정렬 사용\'을 사용하는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-04 09:42:02773검색

Why is My MySQL Query Using

인덱스 사용, 임시 사용, 파일 정렬 사용: MySQL 쿼리에 최적화가 필요합니까?

데이터베이스 테이블에서 데이터를 검색할 때 다음이 중요합니다. 처리 시간과 리소스 소비를 최소화하는 효율적인 쿼리를 작성합니다. MySQL은 더 빠른 쿼리 실행을 촉진하기 위해 다양한 최적화 기술을 제공하지만 때로는 쿼리가 여전히 최적이 아닌 동작을 나타낼 수 있습니다. 이 경우 EXPLAIN 출력에서 ​​"Using index; Using temporary; Using filesort"를 반환하는 쿼리를 살펴보겠습니다.

제공된 쿼리를 살펴보겠습니다.

    explain SELECT 
            el.object_id, 
            leo.object_desc, 
            COUNT(el.object_id) as count_rows
        FROM 
            event_log el 
            LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id
        GROUP BY 
            el.object_id
        ORDER BY 
            count_rows DESC,
            leo.object_desc ASC

"임시 사용" 이해

MySQL 문서에는 ORDER BY와 GROUP BY 절 사이에 불일치가 있거나 ORDER BY 또는 GROUP BY에 테이블의 열이 포함된 경우 임시 테이블을 생성할 수 있다고 명시되어 있습니다. 조인 대기열의 첫 번째 테이블이 아닌 경우. 이 쿼리에서는 두 가지 조건이 모두 충족되었습니다. ORDER BY 절은 계산 필드인 count_rows를 기준으로 정렬하고, GROUP BY 절은 다른 테이블의 el.object_id를 기준으로 그룹화합니다. 따라서 임시 테이블을 사용하여 정렬 및 그룹화 프로세스를 용이하게 합니다.

"Filesort 사용" 이해

정렬은 계산된 필드 count_rows에서 수행되므로, 이 작업에는 인덱스를 사용할 수 없습니다. 따라서 MySQL은 결과를 반환하기 전에 디스크에서 데이터를 읽고 메모리에서 정렬하는 filesort를 사용합니다.

쿼리 최적화

성능을 향상하기 위해 이 쿼리를 사용하고 임시 테이블 및 파일 정렬의 사용을 제거하려면 다음과 같은 적절한 인덱스 생성을 고려할 수 있습니다.

CREATE INDEX idx_event_log_object_count ON event_log(object_id, COUNT(event_id));

이 인덱스를 사용하면 MySQL이 각 object_id에 대한 이벤트 수를 직접 검색하여 제거할 수 있습니다. 임시 테이블과 파일 정렬이 필요합니다.

위 내용은 내 MySQL 쿼리가 \'인덱스 사용, 임시 사용, 파일 정렬 사용\'을 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.