2014-05-09 1 views
0

저는 매일 40000 개의 행이있는 다른 테이블을 사용하여 40000 개의 행을 가진 테이블을 업데이트해야하는 작은 애플리케이션이 있습니다. 이 작업은 내가에서 일하는 회사의 보고서 생성에 대해 서로 다른 (외부) 데이터 소스에서 데이터를 병합하고이 :(MYSQL 일치 항목에서 UPDATE의 행을 제거합니다.

가 지금 내가

UPDATE table1, table2 SET table1.column1=table2.column1 WHERE table1.column2=table2.column2 
같은 형식의 쿼리를 사용하는이 시간에 나에게 사용할 수있는 유일한 방법입니다

그리고 완료하는 데 엄청난 시간이 걸립니다. 이것은 40k에서 40k를 비교하므로 1600000의 비교 결과를 얻을 수 있습니다. 가능한 경우 SQL이 작업에서 행을 제거하도록 지시하는 쿼리를 만들 수 있습니까? 매치/업데이트 할 때마다 40K 개의 행이 하나씩 삭제됩니다.

원본 테이블을 다음과 같이 복사하여 임시 테이블 및 결과 테이블을 업데이트 한 후 같은 키를 사용하여 행을 제거하지만 아마도 더 우아하고 빠른 방법이 있습니다 :

통찰력을 가져 주셔서 감사합니다!

/편집 - 정확한 - 오히려 'SELECT'가 아닌 'UPDATE':

+0

두 테이블의 column2에 인덱스를 추가하면 시간이 현저히 줄어 듭니다. 또한 귀하의 선택 업데이 트해야한다고 생각합니다 :-) – vogomatix

답변

0

테이블에서 행을 제거하는 것, 즉 DELETE 문을 필요로; 그리고 그것은 훨씬 더 느리고 빠르지 않게 만들 것입니다.

업데이트 성능을 향상 시키려면 적절한 인덱스를 추가하는 것이 좋습니다.

... ON table2 (column2, column1) 

훨씬 더 빠르게 "일치"(2 열 값의 조회를) 만들 것입니다 : 가능성이 최고의 후보는 커버링 인덱스입니다. 인덱스에서 column1 값을 사용할 수 있으면 해당 값은 기본 테이블의 페이지에있는 행을 다시 조회하지 않고 인덱스에서 직접 리턴 할 수 있습니다.

수행해야 할 비교 연산 수를 줄이는 방법에 대한 올바른 아이디어가 있습니다. 그것은 인덱스의 존재 이유입니다. 수행해야 할 비교 횟수를 크게 줄임으로써 비교 작업을 훨씬 빠르게 수행합니다. 색인은 대다수의 비교를 제거하는 방식으로 구성됩니다. 우리는 모든 행의 모든 ​​값을 비교할 필요가 없으며, 데이터베이스는 모든 행을 검사 할 필요가 없다는 것을 데이터베이스가 신속하게 판별 할 수 있도록 값을 구성합니다. 데이터베이스는 모든 행에 대해 불가능하다는 것을 알고 있기 때문입니다 찾고있는 값과 일치하는 행을 찾습니다.


나는 당신이 당신이 UPDATE 문이 아닌 SELECT을 실행하는 것을 의미 기대합니다.

+0

너희들이 내 인생을 바꿨어 ... 내가 사용했던 쿼리는 25 분 정도가 걸렸지 만. 인덱스를 사용하면 1 초 미만이 걸립니다 ... 기본 지식 부족으로 나는 겸손 해지고 놀랐습니다 ... –

관련 문제