>  기사  >  데이터 베이스  >  MySQL 쿼리에 \"임시 파일 사용\" 및 \"파일 정렬 사용\"이 표시되는 이유와 이를 최적화할 수 있는 방법은 무엇입니까?

MySQL 쿼리에 \"임시 파일 사용\" 및 \"파일 정렬 사용\"이 표시되는 이유와 이를 최적화할 수 있는 방법은 무엇입니까?

DDD
DDD원래의
2024-11-04 17:04:02278검색

Why Do MySQL Queries Show

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 절이 있거나, ORDER BY 또는 GROUP BY에 조인 대기열의 첫 번째 테이블이 아닌 테이블의 열이 포함되어 있습니다.

주어진 쿼리에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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