SELECT COUNT(*) AS cnt
FROM products
WHERE ExternalProductId IS NOT NULL
GROUP BY SourceId, ExternalProductId
HAVING cnt > 1
(ExternalProductId, SourceId, AnotherField)에 대한 색인이 있습니다. Explain은 인덱스가 사용되었음을 보여줍니다. 이것은의 "추가"열에 인쇄 설명 :다음 쿼리가 테이블 데이터를 복사하는 이유는 무엇입니까?
Using where; Using index; Using temporary; Using filesort
나는 쇼 PROCESSLIST를 통해 내가 볼 쿼리 실행
Copying to tmp table on disk
내가 지수 장소에서 작업이 쿼리를 조정할 수 있습니까? 또한이 테이블에서 동시에 작업하는 다른 프로세스로 인해 결과가 약간 부정확 할 수도 있습니다. 격리 수준을 변경하여 쿼리 성능을 향상시킬 수 있습니까? 시도
나는 오해가 있다고 생각합니다. 임시 테이블은 작업을 수행하기 위해 테이블의 모든 데이터를 복사한다는 것을 의미하지 않습니다. 단지 중간 결과를 임시 테이블에 복사하여 나중에 처리 할 수 있음을 의미합니다. 임시 테이블에는 ExternalProductID가 null이 아니고 cnt 열이있는 모든 레코드가 포함되어있어 'HAVING'절을 평가할 수 있습니다. 둘째, 트랜잭션 격리는 임시 테이블과 아무 관련이 없습니다. – bot403
@ bot403 - 방금 DBA와 이야기를 나누었습니다. 그리고 그는 당신과 동의합니다. 나는 당신의 의견이 실제로이 질문에 대한 지금까지의 최선의 대답이라고 믿습니다. – ripper234
예, 대답은 제 1 번과 ajreal의 색인 제안이라고 생각합니다. – bot403