2010-11-21 4 views
1

SQL 데이터베이스를 사용하여로드가 많은 웹 응용 프로그램 개발 방법에 대한 질문을하고 싶습니다. 다른 기사에 대한 액세스를 제공하는 간단한 CMS 시스템이 있다고 가정합니다. 또한 데이터베이스에 기사 방문 수량을 저장하려고합니다. 이 방문수 카운터는 사용자가 기사를 볼 때마다 증가합니다. SQL 데이터베이스의 관점에서SQL 데이터베이스를 사용하여 웹 프로젝트로드 높이기

, 우리는 우리가 사용자가 문서를 방문 할 때마다 증가하는 데 필요한 테이블 "조"에서 "방문"정수 필드가 있습니다. 기사에 동시 방문 수가 많으면 현재 데이터베이스 행의 "방문수"필드 값을 올바르게 수정해야합니다.

나는 비관적 잠금 방식을 사용 : "업데이트 .. SELECT". 사용자가 일부 기사를 방문 할 때마다 "기사"테이블의 특정 행을 잠그고 "방문수"카운터를 늘립니다.

이 방법이 맞습니까?

내 프로젝트에 MySQL 데이터베이스를 사용하고 있습니다.

답변

2

이 방법은 중간 부하 사이트 작동하지만 결국은 잠금 문제로 끝날 것입니다. 매우 높은 부하 웹 사이트에

, 당신은 메시지 큐를 구현하려는, 큐에 "방문"이벤트를 보낼 것입니다.

오프라인 프로세스는 큐를 읽고 적절하게 열을 업데이트합니다. 이렇게하면 언제든지 하나의 프로세스 만 해당 특정 열에 액세스 할 수 있습니다.

+0

로드 범위를 숫자로 지정할 수 있습니까? 그게 좋을거야. – benjamin

2

나는 확실히 문서 데이터 ("방문 횟수"와 같은) 집계 데이터를 저장하는 것을 권장하지 않고, 각 방문에 대해 하나 개의 새로운 기록을 기록 별도의 테이블을 사용합니다. 타임 스탬프, article_id, IP 주소 및 기타 데이터를 저장하십시오. 이 이유는 각 방문에 대해 각 기사의 데이터베이스 레코드를 잠글 필요가 없기 때문에 잠금 문제/경합이 발생할 가능성이 높습니다. 당신이 뷰의 수를 검색에 관심이있는 경우

지금, 로그 테이블에 간단한 선택을한다. "충분히 좋은"중형 사이트를 위해; 로드가 증가하면 정기적으로 아티클 당 조회수를 계산하고 뷰 카운터를 캐시하여이 데이터에 대한 액세스 속도를 높여야합니다.

+0

FlySwat이 쓴대로, 기사에 대한 로깅 액세스는 대기열에 기록한 다음 업데이트를 일괄 처리하여 수행 할 수도 있습니다. 여전히 뷰가 발생할 때마다 기사 테이블을 업데이트하여 기사 레코드를 잠글 필요가 있다는 단점이 있습니다. – mhanisch