2017-12-08 17 views
2

쿼리 구문에서 제한 구문을 사용하는 방법에 대해 알고 싶습니다. 180000 개의 행이 있습니다. 그래서 나는 한계 구문을 사용하여 데이터를 선택할 것이다. 그래서 나는 한계 구문 및 쿼리 성능Query performace의 MySQL 제한 구문

+0

잘 모르는 최근 개선 사항이없는 경우이 둘 사이에는 아무런 관련이 없습니다. – GhostGambler

+2

LIMIT는 쿼리 실행 속도를 늦출 수 있습니다. 20000000 개의 레코드를 가져와야하기 때문에 LIMIT 10000000, 10000000과 같은 큰 오프셋을 사용할 때. 그리고 대부분의 경우 MySQL은 쿼리를 실행하기 위해 임시 테이블을 사용해야합니다. –

+1

@RaymondNijland LIMIT을 사용하지 않으면 통신 채널을 통해 전송해야하는 모든 데이터가 전송되어 더 이상 버려지지 않습니다. 쿼리에서 사용할 수있는 position-column을 사용하는 것과 비교하면 속도가 느리지 만 모든 경우에 가능하지는 않습니다. – GhostGambler

답변

3

LIMIT은 일반적으로 요청하는 클라이언트에 MySQL 서버에서 큰 결과 세트를 보내는 비용의 일부를 저장 안부 사이의 관계를 알고 싶습니다. 클라이언트 측에서 불필요한 행을 건너 뛰는 것보다는 결과 집합 행을 몇 개만 필요하면 LIMIT을 사용하는 것이 좋습니다.

LIMIT을 사용하는 악명 높은 성능 반 패턴가 있습니다. 이 같은 쿼리는 MySQL 서버 리소스 (시간 및 RAM)에

SELECT a,whole,mess,of,columns,... 
    FROM big_table JOIN big_tableb ON something JOIN big_tablec ON something .... 
    ORDER BY whole, mess DESC 
    LIMIT 5 

등의 쿼리를 사용합니다. 왜? 큰 결과 집합을 생성 한 다음 정렬하고 몇 행을 제외한 모든 행을 삭제합니다.

또 다른 성능 반 패턴은 복소수 결과 집합에 적용된 LIMIT small_number, big_number입니다. 적은 수의 행을 얻으려면 많은 행을 사용해야합니다.

SELECT a,whole,mess,of,columns,.. 
    FROM (
     SELECT big_table_id 
      FROM big_table JOIN big_tableb ON something JOIN big_tablec ON something .... 
     ORDER BY whole, mess DESC 
     LIMIT 5, 200000 
     ) ids, 
    JOIN big_table ON ids.big_table_id = big_table.big_table_id 
    JOIN big_tableb ON something JOIN big_tablec ON something ... 

이 패턴 주문을 한 후 그냥 id 값이 아닌 컬럼의 전체 엉망 폐기 :

는이 같은 연기에 가입 패턴, 뭔가이 해결할 수 있습니다.

LIMIT을 사용하면 실제로 을 사용하면 색인을 통해 결과 집합을 정렬하는 경우에 성능이 향상됩니다 (). 당신이 datestamp에 인덱스를 가지고 예를 들어, 당신은 datestamp 인덱스를 뒤로 스캔하고 단지 스물 행을 검색 할 수 있습니다

SELECT datestamp, col, col 
    FROM table 
    ORDER BY datestamp DESC 
    LIMIT 20 

MySQL의 쿼리 계획을한다.

+0

입니다 ('LIMIT offset, limit'이므로 주석의 일부는 거꾸로 나타납니다.) –

1

모든 SQL 명령의 영향을 신속하게 측정하는 가장 쉬운 방법은 EXPLAIN을 사용하고 행 수를 확인하는 것입니다. EXPLAIN부터는 대개 쿼리가 좋은 방법입니다. 검색어 앞에 'EXPLAIN'을 넣으면 얼마나 비싼 지 알 수 있습니다.

보내기 대용량 데이터 세트는 문제가되지 않을 수도 있습니다 -이 '가 느린 매우입니다 ORDER BY의 사용의 내 경험에 정렬

을이야. 자주 LIMITORDER BY이 명백한 이유로 함께 사용되며, 이는 바로 LIMIT 자체가 아니라 느린 부분 인 정렬입니다.

LIMIT은 그렇지 않으면 버려 질 수있는 대용량 데이터 세트를 반환하지 않지만 대개 실제로는 데이터베이스가 동일한 로컬 네트워크 또는 동일한 서버에 있습니다. 네트워크 성능 & 대용량 데이터 세트는 일반적으로 제한 요소가 아닙니다. 대신 데이터를 반환하기 전에 데이터를 정렬하는 비용이 가장 높습니다. 이러한 종류의 최적화 (예 : 쿼리와 일치하는 인덱스 생성)를 통해 가장 큰 이점을 얻을 수 있습니다.

+0

'EXPLAIN은 보통'LIMIT'을 무시합니다. 그러므로 여기에 도움을 요청하지 마십시오. –