문제

이에 대한 질문이 단점이 있습니다.

상상 소셜 네트워크입니다.각 사용자는 상태 메시지는 그 변경할 수 있다.때마다 그는 그것을 변경하는 모든 자신의 친구는 통보를 통해 벽어(Facebook).

이 작업을 확인합니다.우리가 3 테이블 사용자는(id,name),FriendLists(userId,friendUserId),알림이(?).

지금 가정하자 각 사용자는 약 50 명의 친구들에서 그의 친구 목록입니다.나는 딜레마에 직면하는 방법-알림을 구현하는 테이블.


1 옵션

CREATE TABLE Notifications
(
toUserId bigint NOT NULL,
[identity] bigint IDENTITY(1,1) NOT NULL,
fromUserId bigint NOT NULL,
data varchar(256) NOT NULL,
CONSTRAINT [PK_Notifications] PRIMARY KEY CLUSTERED (toUserId, [identity])
)

알림을 보낼:

-- Get all friends of @fromUserId.
WITH Friends AS
   (SELECT FriendLists.friendUserId
 FROM FriendLists
 WHERE userId = @fromUserId)
-- Send updates to all friends.
SELECT
 friendUserId as toUserId,
 @fromUserId as fromUserId,
 @data as data
INTO Notifications
FROM Friends

이 경우에는 각각 상태 변경을 우리는 50 기록(추측 50 친구).이것은 나쁜 것입니다.그러나 좋은 점은 검색에 대한 알림을 특정 사용자 그것은 정말 빠르고 있기 때문에 우리는 인덱스에 toUserId.

2 옵션

CREATE TABLE Notifications
(
toUserId bigint NOT NULL,
[identity] bigint IDENTITY(1,1) NOT NULL,
fromUserId bigint NOT NULL,
data varchar(256) NOT NULL,
CONSTRAINT [PK_Notifications] PRIMARY KEY CLUSTERED ([identity])
)
CREATE NONCLUSTERED INDEX [IX_toUserId] ON Notifications (toUserId ASC)

알림을 보낼:

-- Get all friends of @fromUserId.
WITH Friends AS
   (SELECT FriendLists.friendUserId
 FROM FriendLists
 WHERE userId = @fromUserId)
-- Send updates to all friends.
INSERT INTO Notifications(toUserId, fromUserId, data)
    VALUES(friendUserId, @fromUserId, @data)

여기서 우리는 삽입하는 단일 기록당 상태를 업데이트합니다.이것은 좋은 것입니다.나쁜 점은 검색의 알림은 속도가 저하될 때문에 기록하지 않은 클러스터에 의해 toUserId.


을 받고 알림 은 동일한 모두에 대한 방법:

SELECT TOP(50) fromUserId, [identity], data
FROM Notifications
WHERE toUserId  = @toUserId

그래서 무엇을?

도움이 되었습니까?

해결책

첫째,읽은 항상에서 압도적인 비교를 쓰기 때문에,각각의 벽을 볼 것입니다 많은 것보다 더 많은 시간이 될 것입 업데이트됩니다.그래서 당신이 더 읽고 무척 빠르다.

둘째,하나의 문제는 고유의 이러한 종류의 큰 소셜 네트워킹 사이트에 분포 데이터의(분할,분할,아니 하나의 데이터베이스가 이제까지를 저장할 수있는 모든 계,모든 친구들,모든 알림)의미하는지에 벽,친구야에 통보 기타 서버입니다.이것이 의미 있는 비동기와 메시징 기반의 어쨌든.

그래서 나는 확실히 가을 가진 구조를 최적화를 읽고 있습니다.

내가 권하고 싶을 가 공개 프레젠테이션 수행하여 다양한 사람들에 관련된 건물의 사이트는 다음과 같 Facebook and MySpace,아 이 크리스 타 Stelzmuller 나.그들은 많은 설명의 사고와 추론으로가는 그들의 디자인이다.

다른 팁

SELECTS에 비해 업데이트는 매우 느립니다 ... 몇 배 순서. 또한, 사이트 스케일로서 모든 페치를 메모리로 캐싱하므로 SELECT의 속도는 사소합니다.

이 상황에서,그것은 같은 나쁜 생각을 만들기 클러스터에 인덱스(toUser,id)기 때문에 인덱스 해야 삽입할 수 있 오름차순으로 정렬됩니다.물론 SQL 이 돌을 유지하는 테이블로 정렬하지만 이것에서 높은 성능 비용(는 당신의 질문입니다.) 그러나 일반적으로,는 삽입가를 수 있는 특별한 순서없는 권장하지 않는한 클러스터 인덱스입니다.여기에 매우 좋 부품 문서 에 대한 인덱스 권장 사항입니다.

을 말하고 있는,내가 가진 지팡 id 열로 인덱스를 만들고 인덱스에 toUserId 그리고 어쩌면 날짜/시간 열입니다.를 포함하여 datetime 할 수 있는 더 효율적으로 쿼리를 위한 최근의 데이터입니다.

에 관한 느 업데이트 상태 업데이트 소셜 네트워킹 사이트에 완벽한 상황에 대한 메시지 큐입니다.는 방법을 조정할 수 있는 데이터베이스로 만드는 데 필요한 읽는 빠르고 있는 경우에 미치는 영향 쓰 성능,사용자지 않아 고통 받고 있습니다.그들의 관점에서 업데이트 즉각적이었지만 그것은 몇 분 정도의 시간이 걸릴 수 있습을입니다.

형 데이터베이스의 경우 나는 연기하는 SQL 전문가에 대해 이야기 할 수 있는 분할 전략(은 작은 더 관리 테이블에 대한 새로운 데이터,크/많은 인덱스 테이블에 대한 오래된 데이터)및 복제 솔루션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top