Raymond Nijland 의 질문에 대한 코멘트에서 생성 된 커뮤니티 위키 답변
사용하십시오 EXPLAIN. 이렇게하면 쿼리에 디스크 IO가 필요한지 확인할 수 있습니다. 당신은 열에서 피할 필요가 여분의 "임시 사용" "임시 사용"또는; filesort 사용하기 (filesort는 잘못된 이름입니다. 결과 집합이 메모리에 맞으면 quicksort가 메모리에서 실행됩니다) ".
이것은 하위 쿼리 / 연합 / 주문 별 / 그룹 별 /에 의해 발생했을 가능성이 높습니다 ... 결과가 크고 MyISAM 디스크 기반 임시 테이블이 생성되고 결과를 정렬해야하는 경우 결과를 정렬해야합니다 Quicksort 알고리즘으로 IO 읽기 및 IO 쓰기를 기반으로 설정됩니다.
에서 MySQL은 내부 임시 테이블을 사용 MySQL은 디스크 기반 MyISAM 테이블을 만들 필요가있을 때 당신은 읽을 수 있습니다. 아마도 avg_row_length * rows를 사용하여 ( innoDB 엔진에서는 Explain 의 행 값이 정확하지는 않지만) 결과가 힙에 맞는지 확인할 수 있습니다. SHOW TABLE STATUS 구문을 참조하십시오 .
일반적으로 InnoDB 또는 MyISAM이 I / O 요청을 피하는 데 더 좋습니까?
InnoDB는 테이블 데이터와 인덱스 데이터를 버퍼링하는 반면 MyISAM은 인덱스 키만 버퍼링합니다. 추가 설명 열에 "인덱스 사용"이 표시되지 않으면 테이블 데이터에 대한 I / O가 필요합니다 .
둘 다 인덱스를 사용하는 경우 : InnoDB를 사용하면 버퍼가 뜨거워지면 메모리에서 데이터를로드 할 수 있습니다. 디스크에서 인덱스를 가져와야 할 경우 선택, 삽입 및 업데이트에 필요한 IO 읽기를 계산하는 데 사용할 수있는 공식이 있습니다. 쿼리 성능 추정 에서 :
작은 테이블의 경우 일반적으로 하나의 디스크 탐색에서 행을 찾을 수 있습니다 (인덱스가 캐시되어 있기 때문에). 더 큰 테이블의 경우 B- 트리 인덱스를 사용하여 행을 찾으려면 다음과 같은 많은 탐색이 필요하다고 추정 할 수 있습니다.
log(rows) / log(index_block_length / 3 * 2 / (index_length + data_pointer_length)) + 1
InnoDB 인덱스는 PRIMARY / UNIQUE 키의 데이터를 KEY 인덱스에 저장하기 때문에 더 큽니다. 이 방법은 더 빠르며 훨씬 적은 IO 탐색이 필요하지만 InnoDB 데이터 또는 인덱스를 압축 할 수 있습니다.