2010-05-19 4 views
1

Grails 웹 앱에서 StackOverflow 또는 MyLifeIsAverage와 유사한 액세스 패턴을 사용하고 있습니다. 사용자는 항목에 투표 할 수 있으며 투표는 투표 수에 따라 항목 목록을 정렬하는 데 사용됩니다. 정렬 된 선택 쿼리가 수행되는 동안 투표를 배치 할 수 있습니다.SO와 같은 사이트에 대한 데이터 액세스 전략 - 정렬에 영향을주는 SQL 쿼리와 동시 업데이트?

선택 항목이 테이블의 큰 부분을 잠그므로 일반적인 트랜잭션 잠금으로 인해 충분한 트래픽이 제공되는 업데이트가 영원히 걸릴 것으로 보입니다. 누구나 이와 같은 데이터 액세스 패턴으로 앱을 작업 한 적이 있습니까? 그렇다면 이러한 업데이트를 허용하고 더 많거나 적게 동시에 수행하도록 선택할 수있는 방법을 찾았습니까? 사람이 그렇게 접근 방식을 알고있는 사람이 있습니까?

제 생각에 정렬 된 더티 읽기를 선택하는 것이 좋았습니다. 항상 완전히 최신이 아닌 경우 받아들이 기 때문입니다. 이것은 아마도 이러한 선택 및 업데이트의 성능을 향상시킬 수있는 유일한 방법이지만 누군가가 더 나은 방법을 알고 있다고 생각했습니다.

답변

1

데이터베이스에 대해 너무 많이 추측하지 마십시오. 데이터베이스는 매우 복잡한 동물이며 거의 항상 당신이 생각하는대로 작동하지 않습니다. 모던 데이터베이스 (예 : myisam 테이블이 아님) 인 MVCC 데이터베이스는 크게 잠그지 않고 테이블 스캔을 수행합니다. MVCC의 전체 개념은 쓰기가 읽기를 차단하지 않으며 반대의 경우도 차단한다는 것입니다. 그러나 여기서 테이블 스캔은 수행되지 않습니다. 능률적으로 질문에 응답하기 위하여는 아마 투표에 색인이있다. 이 인덱스는 1) 테이블에서 검색된 행 수를 제한하는 데 사용됩니다. 2) 정렬 된 순서로 (즉, 정렬을 수행하지 않고) 검색합니다.

+0

좋은 점은 계산을 필드에 저장하고 색인을 생성 할 수 있다는 것입니다. 나는 누군가가 투표 할 때마다 색인 된 필드를 업데이트하는 경우 어떻게 수행 될지 궁금합니다. 아마도 시도해보고 스트레스 테스트를 봐야합니다. –

+0

예, 성능 질문을하고 프로파일 링을 직접 해보십시오. 어떤 이유로 든 너무 느린 경우 몇 분 동안 일괄 적으로 투표 할 수 있습니다 (어쨌든 그 길이에 대한 쿼리를 캐싱 할 가능성이 있습니다). 그런 다음 한 트랜잭션에서 함께 적용합니다. 시스템 실패로 일부 표를 잃어 버리면 중요하지 않기 때문입니다. 하지만 문제가되는 것으로 측정 된 경우에만 가능하며 더 간단한 해결책은 없습니다 (항상 생각해보십시오.) – Eloff