2014-11-10 4 views
7

상위 1000 개 레코드를 제외하고 테이블을 업데이트해야합니다. 내 쿼리는 다음과 같다 :N 행 이후의 MySQL 업데이트

UPDATE tableA 
SET price = 100 
WHERE price = 200 AND 
     item_id =12 AND 
     status NOT IN (1,2,3); 

나는 하위 쿼리 approcah 여기서 일 것이다라는 것을 알고 있지만 나는 200000 개 레코드가 WHERE 조건을 만족하는 거대한 테이블을 데하고 성장하고있다. 따라서 하위 쿼리 방식을 따르면 DB가 커짐에 따라 확장되지 않을 것입니다.

또한 쿼리에 LIMIT을 지정하는 것을 보았지만 어느 정도 한계가 있습니다. 내 경우에는 특정 오프셋 후 모든 레코드를 업데이트해야합니다.

총 개수를 찾아서 LIMIT로 지정할 수도 있습니다. 그러나 COUNT() 쿼리가 실패합니다.

답변

0

올바른 해결책이 될지 확실하지 않지만 테이블에 고유 한 ID 열이있는 경우 확실하지 않습니다. 예를 들어, ID라고 말하면, 매우 쉽게 술어를 넣을 수 있습니다. WHERE ID > 1000. 어느 당신은 사용자 정의 변수를 사용할 수 있습니다

UPDATE tableA SET price = 100 
WHERE price = 200 
AND item_id = 12 
AND ID > 1000 
+0

빠른 답장을 보내 주셔서 감사합니다. 하지만 특정 항목을 선택할 때 ID에 의존 할 수 없어 ID가 순서에 있지 않을 수 있습니다. –

+1

은 ID와 함께 고유 한 auto_increment를 의미합니다. 위의 솔루션이 가장 효율적인 솔루션입니다. 그렇지 않으면 엄청난 부하가 올 때 지루합니다. – Rahul

+0

예. 나도 같은 것을 의미했다 :) –

1

처럼 1001th 위치에서 행만을 고려할 것 :

SET @X = (SELECT ID FROM tableA 
    WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3) 
    ORDER BY ID LIMIT 1000,1); 
UPDATE tableA SET price = 100 
    WHERE price = 200 AND item_id =12 AND status NOT IN (1,2,3) 
    AND ID>@X; 

예, "무엇을 먼저 N 행이다"를 정의하는 방법을 몇 가지 방법이 필요합니다. 사용자 정의 변수는 더 많은 옵션을 제공합니다. 일부 선택 쿼리에서 효과적으로 수행 할 수없는 경우 이러한 테이블을 다시 작성하는 방법에 대해 생각할 필요가 있습니다. 어쩌면 다른 색인 접근법, 테이블 분할, 일부 값 캐싱 등

관련 문제