2011-03-18 4 views
5

에 따라 달라집니다MySQL을 사용 filesort 내가이 쿼리가 LIMIT

SELECT * 
FROM `content` AS `c` 
WHERE c.module = 20 
    AND c.categoryID 
    IN ('50', '31', '16', '10') 
ORDER BY `c`.`released` DESC 
LIMIT 5 

을 ... 그리고 나는이 기계가 있습니다. 첫 번째 머신에서 EXPLAIN 쿼리는 LIMIT가 3보다 작 으면 'Where using'을 추가 필드로 반환합니다. LIMIT가 3보다 크면 'Where using; filesort 사용 '(filesort는 3보다 큰 한계로 실행됩니다).

다른 컴퓨터에서는 동일한 DB 및 동일한 쿼리에 대해 서로 다릅니다. LIMIT이 filesort가 실행되는 것보다 60보다 큰 경우입니다.

두 시스템에서 my.cnf는 동일합니다 !!!

filesort를 사용하는 것이 LIMIT에 어떻게 의존하고이 종속성을 어떻게 변경할 수 있는지 아는 사람이 있습니까? MySQL의 LIMIT Optimization에서

+0

정확하게 관련되지는 않지만 테이블에 어떤 색인이 있습니까? –

+0

동일한 db, 동일한 쿼리. 테이블에있는 동일한 (양) 데이터? 같은 인덱스? –

+0

"동일한 DB"라고 가정합니다. 동일한 정보가 포함되어 있지만 각 데이터베이스마다 서로 다른 실제 디스크를 사용하고 있음을 의미합니다. 그렇다면 두 데이터베이스 모두에서'OPTIMIZE TABLE content'를 실행 한 다음 다시 테스트 할 것을 제안합니다. 이렇게하면 잠재적으로 디스크의 인덱스가 재정렬되고 모든 인덱스의 통계가 업데이트되므로 (더 중요한 것은) 어떤 인덱스를 사용해야하는지에 대한 의사 결정 방식이 변경 될 수 있습니다. –

답변

1

: 일반적으로는 전체 테이블 스캔을 수행하는 것을 선호하는 경우

  • 당신이 LIMIT와 몇 행을 선택하는 경우, MySQL은 어떤 경우에는 인덱스를 사용합니다.
  • ORDER BY과 함께 사용하면, MySQL은 전체 결과를 정렬하는 대신 정렬 된 결과의 첫 번째 row_count 행을 찾자 마자 정렬을 종료합니다. 인덱스를 사용하여 순서를 지정하면 매우 빠릅니다. 파일 포트을 수행해야하는 경우 LIMIT 절이없는 쿼리와 일치하는 모든 행을 선택해야하며 대부분의 또는 모든 행을 정렬해야 첫 번째 row_count 행을 찾았는지 확인할 수 있습니다. 두 경우 모두 초기 행을 찾은 후에는 결과 집합의 나머지 부분을 정렬 할 필요가 없으며 MySQL은 그렇게하지 않습니다.

은 또한 또한 당신이 테이블에있는 인덱스에 따라 달라질 수하는 filesort을 수행 여부 (그들은 두 경우 모두 동일?) 테이블의 행 수는 (그것을 동일?) .

동일한 my.cnf에 관한 메모입니다. 이것은 같을 수 있지만 두 시스템에서 같은 양의 메모리입니까? MySQL은 둘 다 같은 양의 메모리를 사용할 수 없을 수도있다.

+0

답장을 보내 주셔서 감사합니다. 인덱스는 데이터 및 구성 파일의 양과 동일합니다. 그래서 혼란 스럽네. 기억의 양은 같지 않습니다, 나는 여기서 원인을 찾기 위해 노력할 것입니다. – Goran

1

filesort를 사용하는 것이 LIMIT에 어떻게 의존하고이 종속성을 어떻게 변경할 수 있는지 아는 사람이 있습니까?

당신이 당신의 쿼리에서 ORDER BY를 사용

, MySQL는 명령 출력을 만드는 방법을 결정해야합니다.

테이블을 스캔하여 결과를 정렬하거나 ORDER BY 열에서 색인을 스캔 할 수 있습니다. 후자의 경우 정렬은 필요하지 않지만 인덱스에서 검색 한 각 레코드에 대해 추가 테이블 조회를 수행해야합니다.

테이블 검색 때문에 인덱스 스캔은 테이블 스캔보다 10 배 정도 비쌉니다.

즉, 레코드를 10 % 미만 (또는 정렬 오버 헤드로 인해 조금 더 많음) 스캔해야하는 경우에만 인덱스 스캔을 사용하는 것이 좋습니다.

LIMIT 3을 사용하는 경우 검사 할 레코드 수를 제한하면 인덱스 스캔이 더 선호됩니다.