2011-03-11 4 views
1

나는 확장 성 MySQL 스키마를 작성하는 방법에 관해서 내가 할 수있는만큼 많이 읽었지 만, 이것이 좋은 생각인지 확실하지 않다.MySQL 업데이트 문이 너무 비쌉니까?

RDS를 사용하여 EC2에서이 프로젝트를 진행하고 있습니다.

내 데이터베이스에는 읽기보다 쓰기가 많은 코어 테이블이 있습니다 (대략 70 %는 쓰고 30 %는 내가 추측 할 수 있음).

그러나 테이블에 새 행을 만들 때마다 5 초마다 업데이트를 추가해야합니다. 대체로, 매초마다 복수 행이 추가/갱신 될 것이므로 UPDATE 문이 1 초마다 실행됩니다. 따라서이 실행됩니다.

내가 읽은 것을 바탕으로, MySQL에는 테이블에 쓸 때 테이블 잠금이라는 것이 있습니다. 이 테이블은 또한 크게 읽혀질 것이므로 행에 UPDATE 문을 사용하기에 너무 많은 오버 헤드/잠금이 발생합니까? (내가 아는 한)

내 옵션은 다음과 같습니다

    (초마다 또는 어쩌면 이상) 자주 기준으로 큰 테이블에
  1. 마십시오 UPDATE 문
  2. 내가 행을 만들 준비 테이블을 가지고 , 갱신하고 준비가되면 (행이 완료 될 때까지 약 20 분) 행을 스테이징 테이블에서 기본 테이블로 운송하십시오.

나는 그들이 콘텐츠를 볼 수 있습니다 전에 내 사용자가 20 분을 기다릴 수 있기 때문에 준비 테이블을 피하려고하지만 필요악이다 아닌지 궁금하네요.

다른 아이디어? 제안?

감사합니다.

답변

2

테이블 잠금이 적용되는지 여부는 저장소 엔진에 따라 다릅니다. MyISAM은 테이블 잠금을 수행한다. InnoDB는 행 잠금을 수행한다. 당신이 쓰기 행을 읽을 수로

, 당신은 이노가 각 행에 대한 동시 액세스 (독자는 작가가 독자를 차단하지 않는, 작가를 차단하지 않음)

하는 경우를 수있다 사용해야합니다 당신은 기본 키를 기반으로 행을 udpate, 그들은 매우 빠른되어야합니다 (귀하의 서버가 IO 가이 beeing에 의해 유지할 수 있다면).

+0

실제로 기본 키를 기반으로 행을 업데이트하고 있습니다. 아직 스토리지 엔진을 결정하지는 않았지만 대부분의 경우 InnoDB가 그다지 빠르지 않다고 들었습니다. 하지만 내 경우에는 InnoDB가 전체 테이블을 잠그고 싶지 않기 때문에 더 나은 솔루션 인 것처럼 보입니다. – user599146

+0

@user 대부분의 응용 프로그램은 쓰기가 거의없는 상태에서 약 90-95 %의 읽기가 가능하며 MyISAM이 약간 더 빠르다고 여겨집니다. InnoDB는 데이터 무결성이 뛰어나 데이터가 손상되지 않도록 보장합니다 (특히 MyISAM은 트랜잭션을 지원하지 않습니다). 이 경우, MyISAM의 테이블 잠금은 높은 읽기 낮은 쓰기 시나리오를 위해 의도적으로 느리게 만들 것입니다. – Davy8

+0

그것은 많은 의미가 있습니다. 당신의 통찰력에 감사드립니다! – user599146

0

Update 문이 비싼 지 여부에 관계없이 어쨌든 수행해야하는 것처럼 보입니다. 테이블을 업데이트하지 않을 수있는 옵션이 있다면 분명 더 성능이 좋겠지 만 그렇지 않다고 가정합니다.

당신이 물어 보는 것처럼 보이는 진짜 질문은 어쨌든 성능보다 동시성에 관한 것 같습니다. 특히 작은 업데이트가 많으면 더 나은 동시성을 얻었는지 아니면 동일한 총 변경 횟수가 포함 된 일괄 업데이트가 더 적은지 여부를 묻는 것처럼 보입니다.

내 경험상 병행 성을 위해 일괄 처리보다는 많은 작은 업데이트를하는 것이 훨씬 좋습니다. 그러나 일괄 적으로 배치하면 일반적으로 업데이트 성능이 향상됩니다.

이해해야 할 또 다른 사항은 여러 유형의 잠금이 있다는 것입니다.갱신 및 선택을위한 테이블 잠금은 동일하지 않으며, 명령문이 행, 페이지 또는 전체 테이블을 잠그는 지에 대한 고려 사항도 있습니다. 일반적으로 잠금 장치는 현지화되어 있지만이 유형의 응용 프로그램에서는 잠금 전략의 구체적인 내용과 특정 요구 사항을 조작하는 방법을 읽는 것이 좋습니다.

+0

흠. InnoDB 테이블에 대한 업데이트를 자주하는 것이 좋습니다. 만큼 작동하지 않아야 SELECT를 개최하지 않습니다 – user599146

+1

그것은 매우 일반적인 성명을 발표하기가 어렵습니다. 거의 항상 그렇듯이 앱이 실행될 가능성이 높은 상황에서 테스트해야합니다. 내 충고의 요점은 당신이 사용하는 DB 엔진에 대한 Locking을 읽는 것이다. 그것은 까다로운 주제이며 잘못하면 큰 파급 효과가있을 수 있습니다. – JohnFx

관련 문제