2014-05-22 1 views
0

사용자가 비디오를 위 또는 아래로 투표 할 수있는 응용 프로그램이 있습니다. 현재 비디오 테이블에는 upvotes/downvotes가 있습니다. 이유는 없습니다 (정수 만 사용). 그러나 모든 단일 사용자가 투표를 할 때 테이블에 글을 쓸 수있는 경우가 있습니다. 이것이 나를 두 번 생각하게 만듭니다.빈번하게 쓰는 것이 더 적은 열이 있습니까? mysql

내가 생각할 수있는 유일한 점은 MSQL이 쓰기 작업을 할 때 테이블 잠금을 사용하면 읽기 속도가 느려질 수 있다는 것입니다. 자신의 작은 3 열 테이블로 투표를 이동하는 것이 더 효율적입니까?

(나는 확실히 MYSQL이 강력 해요 충분한 트래픽이 매우 무거운 도착,하지만 난 것들을 한 번에 제대로을 좋아하지 않는 한 어느 쪽이든.)

+2

업데이트를 필요로하는 인덱스의 유무 또는 사용중인 엔진 (InnoDB는 행 수준 잠금을 사용함)에 영향을 줄 수있는 다른 요소가 있습니다. 확실한 답을 얻으려면 프로필을 작성해야하지만, 별다른 차이는 없을 것입니다. 문제가 생길 때 걱정됩니다. –

답변

2

불행하게도, 대부분의 MySQL의 성능을 질문처럼 대답은 정말 ' 그것은 의존한다. 읽기를 막을 수있는 과도한 잠금을 피하고 자신의 테이블에 표를 넣는 것이 도움이 될 수도 있고 아니면 시간과 복잡성을 낭비하는 것일 수도 있습니다. 내 생각에 가장 큰 변수는 트랜잭션 크기입니다. '투표'필드를 업데이트하면 큰 트랜잭션의 일부인 경우 잠금을 유지하고 추가로 쓰기를 차단할 가능성이 큽니다. 득표가 자동으로 전달되면 그다지 걱정할 필요가 없을 것입니다.

최악의 시나리오는 일이 정말로 힘들고 초당 수백만 표를 처리해야하는 경우 투표 카운터를 MEMORY 테이블로 이동시켜 디스크 테이블과 60 초마다 동기화 할 수 있습니다 .

0

쓰기 작업이 읽기 작업에 영향을 미치는지 여부는 격리 수준에 따라 다릅니다. READ-COMMITED 격리 수준을 사용하면 읽기가 스냅 샷 일관성을 사용하지만 잠금은 필요하지 않습니다. 그러나 하나의 트랜잭션에서 동일한 요청을 여러 번 수행하면 다른 결과가 발생할 수 있습니다. REPEATABLE-READ 격리 수준을 사용하면 읽기가 잠금을 획득하지만 동일한 쿼리를 다시 실행해도 동일한 결과가 발생합니다. (이 둘 이외의 격리 수준이 있습니다.이 격리 수준은 MySQL 웹 사이트에서 읽을 수 있습니다).

내가 할 수있는 최저 격리 수준을 사용하고 필요한 일관성을 얻는 것이 좋습니다. READ-COMMITED isolation으로 얻을 수 있다면 이것을 사용하면 READ-WRITE 경합에 대해 걱정할 필요가 없습니다.

모든 것이 유스 케이스에 달려 있지만, 같은 테이블에 열을 넣어도 괜찮습니다. 필자가 분리 할 수있는 한 가지 경우는 해당 열에 대한 많은 수의 쓰기와 테이블의 다른 열에 대한 많은 수의 쓰기 작업이 모두 중간 규모에서 대규모 규모의 트랜잭션 내에서 수행되는 경우입니다. 그 경우 나는 그들을 떼어 놓을 것이다.

관련 문제