2013-12-10 5 views
0

레코드를 검색 할 수있는 매우 큰 테이블이 있습니다. MySQL을 사용하고 있습니다. 메모리 예외를 피하려면 JDBC를 사용하여 결과를 하나씩 검색하거나 쿼리에 limit 절을 사용해야합니다. limit 절을 구현하는 방법 MySQL

그래서 전체 결과 집합을 검색하기 위해 우리는 다음을 수행해야합니다 :
select * from employee limit 0,1000; //query 1 
select * from employee limit 1000,2000; //query 2 
select * from employee limit 2000,3000; //query 3 
… and so on. 

방법이 (다른 또는 1) 내부에서 실행되는 쿼리입니다.

추가 질문 : 하나 하나를 검색하기 위해 JDBC를 사용하여 비교하여 성능을 될 것입니다 무엇 (본 question)

+0

@ 닫기를 결정한 사람 : 왜 너무 광범위합니까? 그것은 얻을 수있는만큼 구체적입니다. –

+0

나는 이것이 어떤 차이를 만들어 낸다는 것에 놀라움을 금치 못했다. 일괄 처리로 한 번에 하나의 결과 만 검색하게됩니다. 제한을두면 오는 데이터를 "페이지"할 수 있지만 결국 동일한 메모리가 사용됩니다. where 절이 오랜 시간이 걸리는 경우, 사용 된 필드가 색인되어 있는지 확인해야합니다. –

답변

1

난 당신이 알아낼의 모든 행을 스캔하는 방법입니다 시도하고있는 무슨 생각 일괄 처리 된 매우 큰 테이블. 한계는 아마도 이것을하는 가장 좋은 방법은 아닙니다. 인덱스를 사용하여 행을 필터링하는 것이 좋습니다. 이상적으로 이것이 기본 키가됩니다. 정수 기본 키가 있다고 가정합니다.

select * from employee limit 1000; // query 1 
// in your client, record the max. primarry key value in the batch, call that "maxid" 
select * from employee where id > maxid limit 1000; // query 2 
// again, record the maxid (id of the last row) and repeat until no rows are returned 

다음과 같이하면됩니다. 경우에 따라 데이터베이스가 동일한 종류의 작업을 수행하기 위해 제한을 최적화 할 수 있지만 종종 그렇지 않습니다. YMMV와 당신은 성능을 측정해야합니다,하지만 내가 여기서 주장하는 접근 방식은 데이터베이스 질의 최적화가 얼마나 이상하지 않더라도 작동하도록 보장됩니다.

+0

좋은 생각! 그러나 이것을 적용 할 수 없습니다. 어떤 이상한 이유 때문에 where 절은 매우 오랜 시간이 걸린다. 우리는 서버가 아닌 로컬 시스템에서이를 피하고 집계를 수행하려고합니다. –

+1

색인이 있습니까? 서버가 프라이 머리 키를 사용하여 간단한 쿼리를 실행할 수 없다면, 당신이 무엇을해도 괜찮은 성능을 얻을 수있는 희망은 없습니다. –