집 >데이터 베이스 >MySQL 튜토리얼 >MySQL 쿼리에 \'임시 파일 사용\' 및 \'파일 정렬 사용\'이 표시되는 이유와 이를 최적화할 수 있는 방법은 무엇입니까?
MySQL 최적화: "인덱스 사용, 임시 사용, 파일 정렬 사용" 이해
쿼리 실행 시 MySQL은 임시 테이블을 사용할 수 있습니다. "임시 사용" 및 "파일 정렬 사용" 메시지에 표시된 대로 파일 정렬을 수행합니다. 특정 쿼리의 맥락에서 이것이 무엇을 의미하는지 살펴보겠습니다.
EXPLAIN SELECT el.object_id, leo.object_desc, COUNT(el.object_id) AS count_rows FROM event_log AS el LEFT JOIN lookup_event_objects AS 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 절에 없는 계산된 필드 "count_rows"를 기준으로 정렬하고, GROUP BY 절은 조인된 테이블 "lookup_event_objects"의 열을 사용합니다. 따라서 MySQL은 그룹화 및 정렬을 수행하기 위해 임시 테이블을 생성합니다.
"filesort 사용"
MySQL은 인덱스를 사용하여 정렬 작업을 수행할 수 없는 경우 filesort를 사용합니다. 이 쿼리에서는 계산된 필드 "count_rows"에 대한 정렬을 인덱싱할 수 없으므로 MySQL은 filesort를 사용하여 정렬을 수행합니다.
최적화
이 쿼리를 최적화하려면, "count_rows"에 인덱스를 생성할 수 있습니다. 그러나 계산된 필드이므로 다음과 같은 MySQL 트릭을 사용해야 합니다.
CREATE TABLE lookup_event_objects_temp AS SELECT object_id, object_desc, COUNT(DISTINCT event_id) AS count_rows FROM event_log GROUP BY object_id; CREATE INDEX idx_count_rows ON lookup_event_objects_temp (count_rows); ALTER TABLE lookup_event_objects_temp RENAME TO lookup_event_objects;
인덱스된 "count_rows" 필드를 사용하여 이 임시 테이블을 생성하면 쿼리에서 인덱스를 사용하여 작업을 효율적으로 수행할 수 있습니다. 정렬하여 파일 정렬의 필요성을 없애고 임시 테이블 사용량을 줄입니다.
위 내용은 MySQL 쿼리에 '임시 파일 사용' 및 '파일 정렬 사용'이 표시되는 이유와 이를 최적화할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!