2012-11-20 2 views
0

커다란 테이블 (현재 1400 만 개의 행과 개수)이 있습니다. 로그에서 '오류'목록입니다. 이러한 오류 중 일부는 업스트림에 고정되어있는 동안 필터링 할 알려진 문제입니다. 테이블에서 나는 2 비트 'CheckedForFilter'와 'Filtered'를 가지고 있으며, 10,000 행 블록에서 다음을 수행하려고합니다.MySQL - 큰 테이블의 동일한 하위 집합에서 여러 업데이트 쿼리 실행

1) Select on 10,000 rows (where 'CheckForFilter' is false) 
2) Run a series of queries that set the 'Filtered' bit in certain criteria is true 
3) After the last query runs set the 'CheckForFilter' bit to true 

'필터링 된'비트를 설정할 수있는 쿼리 목록은 현재 5이지만 시간이 지남에 따라 늘어날 것입니다. 내 핵심 문제는 매번 동일한 행 집합을 선택하는 방법을 모른다는 것입니다. 너무 오래 실행되는 쿼리가 서버 복제를 지연시키기 때문에 쿼리를 관리 가능한 크기로 유지해야합니다.

+0

음 ... 어쩌면 필터링을 수행 할 정규식 패턴이있는 것 같습니다. 여러 패턴이있는 경우 - 다른 테이블에 저장할 수 있으며 커서에서 모두 동적으로 비교할 수 있습니다. – Randy

+0

다른 생각 - CheckedForFilter 값에 어떤 필터가 적용되었는지 (또는 더 많은 값으로 변경되었는지) 비트 필터를 사용하여 어떤 필터가 검사되었는지 나타낼 수 있습니다. 그러면 실행될 때마다 똑같은 설정에 대해별로 신경 쓰지 않아도됩니다. – Randy

답변

2

오류 테이블에 ID 필드가 있으면이 작업을 수행 할 수 있습니다.

확인할 10,000 개의 ID에 대한 최소 및 최대 ID 값을 포함하는 "필터"테이블을 만듭니다. 이 테이블에 "Checked"라는 플래그를 지정하여 모든 필터가 아직 검사되었는지 확인합니다.

당신의 오류 테이블의 ID를 필드 = 0

작업이 완료되면, 업데이트 CheckedForFilters를 "검사"당신의 "필터"테이블의 최소 및 최대 ID 값 사이에 필터 쿼리를 실행

"필터"테이블의 최소 및 최대 ID 범위 내에서이 레코드에 플래그를 지정하십시오.

"filters"테이블을 업데이트하고 "Checked"필드를 1로 설정하십시오. 원하는 경우 날짜와 시간을 저장할 수도 있습니다.

완료 될 때까지 다음 10,000 개의 레코드를 실행하십시오.

이렇게하면 필터를 실행 한 기록을 유지할 수도 있습니다. 원한다면 각 일괄 처리에 대해 필터가 실행 된 별도의 테이블에 저장할 수도 있습니다.

+0

고마워. 이런 식으로 생각하거나 10,000 개의 키를 저장할 수있는 테이블을 만들려고했다. 요청을 게시 할 때 행 집합에 고정되어있는 쿼리를 여러 개 실행하는 것이 좋겠지 만 이는 확실히 좋은 대안이 될 것입니다. – personalt

관련 문제