2011-09-27 3 views
2

단일 쿼리로 한 번에 여러 행을 업데이트하는 가장 좋은 방법을 찾고 있습니다. 현재 내가 가진 :한 쿼리에서 여러 행 업데이트 매우 느린 성능

UPDATE `profiles` SET `name` = CASE `id` WHEN 1 THEN 'John' WHEN 2 THEN 'Jane' END, `gender` = CASE `id` WHEN 1 THEN 'Male' WHEN 2 THEN 'Female' END WHERE `id`=1 OR `id`=2 

하지만이 약 1 초간하여 개인 업데이트 쿼리에 반대 (내 진짜 쿼리가 2 천만 행의 데이터베이스 (10 개) 필드에) 완료하는 데 약 4 분 정도 걸립니다.

나는 실제로 무슨 일이 일어나고 있는지 알아 내려고 노력하고 있습니까? WHERE 절에 ID를 지정하면 속도가 빨라질 것이라고 생각했습니다.

+0

그냥 빨리 찍었습니다. 나는 이것을 위해 2 가지 다른 질의를 준비 할 것이다.'CASE' 메서드를 사용하면 mysql이'WHERE 'id'= 1 또는 'id'= 2'를 지정해도 모든 ID를 수집하도록 할 수 있습니다. 고유 한 'id'를 직접 사용하여 각 사례에 대한 쿼리를 준비하는 경우이를 수행하는 가장 빠른 방법이 있습니다. 2 개의 명령문을 사용하면이 'CASE' 메쏘드가 쿼리를 이상하게 만든다.) – Marco

답변

0

id에 대한 색인이 있습니까? 그렇지 않은 경우는 (이 시간 오프 피크이의 수행 시간이 오래 걸릴 수 있습니다 경고)를 생성하는 것이 좋습니다 : 그런데

CREATE INDEX id_idx ON profiles (id); 

, 2000 만 행과 열 개 필드에 대한 쿼리 이 길어질 수 있습니다. 특히 인덱스가 없거나 캐시가 차갑다면 특히 오래 걸릴 수 있습니다.

업데이트 : 테스트를 위해 그리고 내가 궁금해서 회신을 시도했습니다. 이를 위해 몇 가지 테스트 데이터를 만들었습니다.

DDL : https://gist.github.com/b76ab1c1a9d0ea071965
업데이트 쿼리 : 이미 다음 내 댓글에 언급 된 MySQL은 중복 된 데이터를 삽입하지 못할 것이다, https://gist.github.com/958de0d848c01090cb9d

그러나 : https://gist.github.com/a8841731cb9aa5d8aa26
펄 스크립트는 테스트 데이터로 테이블을 채 웁니다 id는 프라이 머리 키이지만 고유하지 않기 때문입니다. 테이블 스키마에 댓글을 달거나 DDL을 게시하면 많은 도움이됩니다.

행운을 빈다. 알렉스.

+0

예 id는 기본 키입니다. – Craig

+0

id 값이 1 또는 2이고 여러 번 나타날 수 있습니까? 이것이 열쇠를 만드는 효율적인 방법은 아닙니다. 기본 키를 만들 수있는 고유 한 ID를 테이블에 갖고 있지 않습니까? –

+0

몇 가지 테스트 스크립트를 해킹하는 동안, ID가 고유하지 않으면 mysql (올바르게)이 데이터를 삽입하지 못하게한다는 것을 알아 챘습니다. DDL 테이블을 공유해 주시겠습니까? 'DESCRIBE profiles'입니까? –

0

프로필 테이블에 대한 DDL을 게시 할 수 있습니까? 이렇게하면 어떤 종류의 색인을 설정했는지 확인할 수 있습니다 (예 : 여기에서 id 열이 기본 키라고 가정 할 수 있습니까?). MySQL을 사용하고 있다면 'SHOW CREATE TABLE profiles'를 실행하여 DDL을 생성하면됩니다.

도울 수있는 점 몇 :

1) 대신에 또는 당신의 WHERE 절에 BETWEEN 사용해보십시오. 예 : UPDATE profiles

SET `name` = 

CASE `id` WHEN 1 THEN 'John' 

WHEN 2 THEN 'Jane' END, 

`gender` = CASE `id` 

WHEN 1 THEN 'Male' WHEN 2 THEN 'Female' END 

WHERE `id` between 1 and 2; 

2) 예를 들어, CASE 문을 사용 방지하기 위해 별도의 쿼리에서 쿼리를 분할 시도

update `profiles` 

set `name` = 'John', 

    `gender` = 'Male' 

where `id` = 1; 

update `profiles` 

set `name` = 'Jane', 

    `gender` = 'Female' 

where `id` = 2; 

난 당신이 쿼리를 사용하고있는 상황에서 확실하지 않다 때문에이 가능한 경우 나도 몰라! 희망이 도움이됩니다.

0

모든 입력란에 대해 모든 사례를 지정해 주시면 더 좋은 아이디어를 얻을 수 있습니까? id = 1 및 2에 대해서만 업데이트하는 수정 사례가있는 경우 다음과 같은 두 개의 검색어로 검색어를 분할하십시오.

+0

나는 이들을 개별적으로 실행할 수 있음을 알고 있으며, 그 중 하나는 하나의 쿼리로 실행하는 방법입니다. – Craig

관련 문제