️Justin Bieber 문제
Justin Bieber 문제는 인스타그램에서 저스틴 비버가 사진을 업로드할 때 마다 인스타그램이 다운되거나 매우 느려지는 현상을 말합니다.
이는 그 당시 인스타그램의 '좋아요' 수를 계산하는 방식 때문이었습니다.
인스타그램에서는 어떤 유저가 언제 어떤 사진에 '좋아요'를 클릭했는지 알 수 있습니다.
그래서 저스틴 비버의 팔로워들에게 그의 최신 사진을 표시할 때 해당 사진을 본 모든 사람에 대해 '좋아요' 수를 최신화된 수치로 보여주어야 했습니다.
'좋아요' 수를 계산하기 위한 테이블로 다음과 같은 DB 테이블를 구성해보겠습니다.
Photos
id | title | user_id | file_url |
1 | Photo A | 2 | http://example.com/photo1.jpg |
2 | Photo B | 3 | http://example.com/photo2.jpg |
3 | Photo C | 1 | http://example.com/photo3.jpg |
Likes
photo_id | user_id |
1 | 1 |
1 | 3 |
2 | 2 |
3 | 1 |
위 테이블에서 사진의 '좋아요'수를 계산하려면, likes 테이블에서 그 사진의 대한 COUNT 쿼리를 실행시키면 됩니다.
문제는 저스틴 비버의 수 억명의 사람들에게 '좋아요' 수를 보여주기 위해 많은 사람들이 사진을 좋아할수록 '좋아요' 수를 계산하는 쿼리를 발생시켜야 했기 때문에, 점차 쿼리를 완료하는 데 시간이 더 오래 걸렸습니다.
이에 따라 인스타그램은 Likes 테이블을 Denormalize를 하였습니다.
id | title | user_id | file_url | like_count |
1 | Photo A | 2 | http://example.com/photo1.jpg | 120 |
2 | Photo B | 3 | http://example.com/photo2.jpg | 95 |
3 | Photo C | 1 | http://example.com/photo3.jpg | 1719 |
좋아요 수를 세기 위해 매번 Likes 테이블에서 '좋아요'를 카운트하지 않고, Photos 테이블에 새로운 열을 추가해 전체 좋아요 수를 저장했습니다. 이렇게 함으로써, 수만 개의 좋아요를 셀 필요 없이 사진 테이블에서 하나의 카운터만 유지하고, 좋아요 수를 증가 혹은 감소시켰습니다.
또 다른 솔루션에는
- Caching: '좋아요'수를 저장하는 캐싱 DB를 둡니다.
- Sharding: 샤딩을 통해 데이터를 분산시킵니다.
가 있겠습니다.
참고
'ComputerScience > Database' 카테고리의 다른 글
[Database] Join의 의미와 여러 종류의 Join (1) | 2024.03.07 |
---|---|
[Database] 데이터베이스의 파티셔닝, 샤딩, 레플리케이션 (1) | 2024.03.06 |
[Database]DB 정규화(normalization)개념과 정규화 과정(Normal form), 1NF ~ BCNF (0) | 2024.02.26 |
[Database] 1. SELECT를 활용한 데이터 조회하기 (0) | 2024.02.21 |
[Database] SQL로 DB에 데이터를 추가(insert)하고 수정(update)하고 삭제(delete)하는 방법 (0) | 2024.02.20 |