
기본적으로 내 문제는 많은 업데이트를 매우 빠르게 적용해야 하는 약 17,000,000개의 제품으로 구성된 대규모 테이블이 있다는 것입니다.
테이블에는 ID가 int(10) AUTO_INCREMENT로 설정된 30개의 열이 있습니다.
이 테이블에 대한 모든 업데이트가 저장되는 또 다른 테이블이 있습니다. 이러한 업데이트는 계산하는 데 며칠이 걸리므로 미리 계산해야 합니다. 이 테이블은 [ product_id int(10), update_value int(10) ] 형식입니다.
1,700만 개의 업데이트를 신속하게 발행하기 위해 제가 취하는 전략은 모든 업데이트를 Ruby 스크립트의 메모리에 로드하고 이를 배열 해시로 그룹화하여 각 update_value가 키이고 각 배열이 정렬된 product_id 목록이 되도록 하는 것입니다. .
{
150: => [1,2,3,4,5,6],
160: => [7,8,9,10]
}
그런 다음 업데이트는 다음 형식으로 발행됩니다.
UPDATE product SET update_value = 150 WHERE product_id IN (1,2,3,4,5,6);
UPDATE product SET update_value = 160 WHERE product_id IN (7,8,9,10);
나는 product_id의 정렬된 배치에 대한 업데이트를 발행하는 것이 mysql/innodb를 사용하여 수행하는 최적의 방법이어야 한다는 점에서 이 작업을 올바르게 수행하고 있다고 확신합니다.
이상한 문제가 발생했습니다. 약 1,300만 개의 레코드 업데이트를 테스트할 때 이 작업에 약 45분 밖에 걸리지 않았습니다. 이제 더 많은 데이터, 최대 1,700만 개의 레코드로 테스트하고 있으며 업데이트에는 거의 120분 정도 소요됩니다. 나는 여기서 일종의 속도 감소를 기대했지만 내가 보고 있는 정도는 아닙니다.
속도를 높일 수 있는 방법이나 더 큰 기록 세트로 인해 속도가 느려질 수 있는 방법에 대한 조언이 있습니까?
서버 사양에 관한 한 그들은 꽤 좋으며 메모리/CPU가 풍부하며 전체 DB는 성장할 수 있는 충분한 공간이 있는 메모리에 적합해야 합니다.