포럼
xe 페이징 성능 향상을 위한 DB 구조 개선 제안
2011.04.16 02:34
좀 추상적으로 적었네요ㅎ
예전 300만건 게시판이라고 해서 hatelove 님이 만들었던 기법이 있습니다.
일정 primary key 범위 내의 "실제 존재하는 count 개수"를 따로 저장해 놓았다가 쓰는건데요
이를 이용한 엄청나게 빠른 게시판이 나왔었습니다.
300만건이어도 어디서 접근하든 거의 동일한 속도로 페이지가 출력되어서
신선한 충격이었습니다.
오늘 오랜만에 찾아보니 그 분의 사이트는 안 보이지만 -_-;;
http://levin01.tistory.com/1080 에 기법이나 구현은 잘 설명되어 있네요
mysql 에서 가장 퍼포먼스 영향을 많이 받는 것 중 하나가
limit x, y 라고 알고 있는데요 이 방법을 쓰면 특정 영역별로 인덱스를 더 걸어줘서
더 선택도(selective)가 높아지게 됩니다.
x 값 위치 계산을 위해 mysql 이 맨 처음부터 계산할 필요가 없어지니까요.
당연히 무지막지한 성능향상이 있었구요.
xe 는 상대적으로 더 큰 성능향상이 예상되는데요 이유는 다음과 같습니다.
1. xe 는 rewrite_rule 로 문서 번호만으로 접근하는 경우가 많고
문서 번호만으로 페이지 값까지 유추해 내는 작업이 자주 생기는데
이 때문에 한층 더 느려지는 것으로 알고 있습니다.
page 파라미터가 안 넘어올 떄가 많으니까
limit x, y 에서 x 값마저 모른다는 뜻이죠. 다른 게시판들은 이 값은 그래도 알고 시작하는데
xe 는 이 값마저 추가적으로 계산해서 얻는 경우가 많습니다.
2. 또 한 테이블에 문서들이 같이 모여있기 때문에
document_srl 값이 빠르게 증가하는 경향이 있습니다.
다른 테이블별 게시판보다 기본적으로 선택도가 낮아질 수밖에 없는 단점이 있습니다.
xe 에도 이 기법이 쓰이면 mysql 부하가 주는건 물론이고
cpu 사용률도 낮춰서 전반적인 속도가 훨씬 빨라질 것 같은데요~
추가적인 개수 저장용 테이블이랑 document 테이블에 인덱스 필드를 추가해야 하지만
그 가치는 뽑고도 남는다고 보여집니다.
다른 분 의견은 어떠신가요?
oracle 에서는 db 단에서 이미 내부적으로 이런 것을 다 제공한다고 들었습니다.
정말인가요? -_-;;;;
댓글 25
-
銀童
2011.04.16 03:07
-
redred
2011.04.16 05:44
정렬에 따라 모든 segment 를 다 만들어줄 필요는 없다고 생각합니다.예를 들어 조회순 정렬 segment까지 갱신해야 한다면 그야말로 쓸데없이 index 를 위한 index 구성이니까요-_-;;.저는 우선 최근 작성순만 생각했었습니다.97% 이상이라고 해도 될 정도로 대다수가 쓰는 게시판 정렬방식이기도 하고이 기법이 가장 큰 효과를 낼 수 있는 정렬방식이기 때문입니다..또, query 시 index 의 도움을 더 잘 받기 위한 기법이기 때문에이 방식을 도입한다고 해서 다른 정렬의 목록 읽어오는것이 느려지진 않습니다..최근 갱신순이든 추천순이든 이전의 속도 그대로 나오니 별 문제 될 것이 없어 보입니다...곰곰히 생각해보니 조회순 정렬같은 거라면 득보다 실이 크겠지만최근 갱신순이라면 이것도 꽤 괜찮을것 같은데요?.최근 갱신순이라면 글이 마구 마구 튀어 올라와 뒤로 사라지는 게시판이라기보다는토론류로 일부 게시물이 반복 노출되고 댓글을 집중시키는 게시판이죠?글 위치가 바뀌는 횟수가 비교적 적기 때문에 segment 재구성 부하도 덜할 것 같습니다.(뭐, 이건 사이트 성격마다 다르니 옵션이나 좀 더 의견이 필요할 것 같네요).memcached 의 분산 db 를 얘기하시는 거라면..xe 라면 약 5% 미만의 사람들만 쓸 수 있을 것 같습니다. 웹호스팅으로 쓸 수 없잖아요.문제는 DB 분산이 꼭 속도를 빠르게 하지도 않고요.in-memory db 또한 사양이 만만치 않습니다.xe 관리자 중엔 1% 나 쓸 수 있을것 같습니다. -
銀童
2011.04.16 09:58
그러게요 아무 생각도 없이 댓글을 밤에 달았다가 아침에 멀쩡한 정신으로 생각해보니
최근 작성, 최근 갱신 두개만 segment 를 해도 되겠다는 생각이 듭니다. [..]
괜찮은 아이디어 같네요. -
디제이쿠
2011.04.16 13:27
게시판 정렬 방식에도 변경이 필요하다고 봅니다..
지금은 document_srl 을 가지고 orderby 등의 컬럼에서 처리하는데..
개인적으로는 등록시간 기준으로 정렬하는게 어떨까 싶습니다.xe의 document_srl도.. 비효율적인 구조라고 생각이 되요.
documnet_Srl이 호출될때마다 카운트가 증가하는 것은 문제가 있다고 보여집니다.
동시에 여러 사람이 글쓰기를 시도하면, 글이 꼬이는 경우도 발생하고요.. (대부분 그 정도의 사용량을 가진 사이트가 없지만)아무튼 xe의 성능이 대폭 개선되면 좋겠네요..
-
마일드^^
2011.04.17 15:41
전 데이타 120만건 이라도 zend_cache + SSD 하드 디스크 사용해서 매우 빠르게 출력하고 있습니다.
결론은 SSD 와 인덱스의 승리 라고할까요 ?
http://www.allhard.co.kr 데이타 120만건에 페이지 느낌을 한번 확인해보세여.
SSD 로 바꾸면 read 횟수 몇 번 더 차이나는거 io 속도에서 다 받쳐줄꺼같네요. -
마일드^^
2011.04.17 15:50
흠 아까 그 분 게시물 보니 mssql 해법 찾으시던데
제가 해결한 페이징
http://blog.naver.com/belladonnaf?Redirect=Log&logNo=50075153342
group by 안에서 페이징 사용한거랑, 일반적인 ms-sql 페이징 기법 등을 소개해놨어요.
1. xe 는 rewrite_rule 로 문서 번호만으로 접근하는 경우가 많고
문서 번호만으로 페이지 값까지 유추해 내는 작업이 자주 생기는데
이 때문에 한층 더 느려지는 것으로 알고 있습니다.
page 파라미터가 안 넘어올 떄가 많으니까
limit x, y 에서 x 값마저 모른다는 뜻이죠. 다른 게시판들은 이 값은 그래도 알고 시작하는데
xe 는 이 값마저 추가적으로 계산해서 얻는 경우가 많습니다.
--> 이 부분은 mysql 인 경우에는 my.cnf 에서 query_cache 얼마잡아두었냐 따라 틀리겠지만 캐싱이 된 경우라면
아마 0.03초~ 0.05 정도의 손실이 발생합니다.
2. 또 한 테이블에 문서들이 같이 모여있기 때문에
document_srl 값이 빠르게 증가하는 경향이 있습니다.
다른 테이블별 게시판보다 기본적으로 선택도가 낮아질 수밖에 없는 단점이 있습니다.
--> 그누보드 처럼 여러테이블 쭉 펼쳐두는 건 정말 비효율적인 DB 구조인것 같아요.
지금 XE 테이블 구조가 잘 나온거고 그보다 잘 나온게 워드프레스 테이블 구조입니다.
데이타 350만건이라도 전혀 지연이 없더군요.
그냥 페이지 속도 튜닝은 캐싱 + input /ouput 커널튜닝 잘하면 다 됩니다 -
redred
2011.04.17 18:33
http://allhard.co.kr 에도 들어가 봤습니다..이 페이징 기법은 페이지 번호가 클 때에도 빠르게 하기 위한 것입니다.기존 로직도 앞 페이지는 빠르고요~ 뒷 페이지로 갈수록 느려지는 문제점이 있습니다..사이트가 빠르다고 하셨는데Last 라고 적혀있는 버튼 눌러서 맨 뒤의 페이지 가 보셨나요?정확히 컴퓨터 시계로 지켜보니 3~4초가 걸렸습니다..이 기법을 적용시키면 맨 앞 페이지 로딩하는 것처럼 거의 눈깜빡할 정도의 속도가 나올 것입니다..그 맨 뒷 페이지 누가 본다고그닥 빨라지는게 의미 없지 않느냐라고 생각하시겠지만 꼭 그렇지는 않습니다.다음과 같은 이유입니다..1. 글 하단에 페이지 목록을 불러오는 경우 그 성능하락은 훨씬 큽니다..님 사이트가 SSD 를 적용해서 더 빠른 면도 있겠지만더 큰 영향은 글읽기 하단에 페이지 목록을 불러오지 않는다는 것입니다.특정 문서 번호를 주고 그 문서만 가져오는건 기존 mysql 이나 xe 가 아주 잘 하는 부분입니다.다른 xe 사이트도 문서 목록만 읽어들이지 않는다면 훨씬 빨라질 거구요..하지만 제 사이트의 게시판이나 xe, 또는 한국의 다른 커뮤니티 사이트들을 보면적어도 50% 이상의 게시판들은 글 하단에 목록을 표시하고 있습니다.(80% 라고 적고 싶지만 확실한 통계는 아니라서 못 적겠네요).ruliweb.com 가보셨나요? 거기는 목록을 표시하지 않습니다.(페이지 뒤로 갈때마다 아주 귀찮습니다-_-)또 외국 사이트들 가 보면 바로 이전 글, 바로 이후 글의 목록만 표시하고전체 목록을 일부러 표시 안하는 게시판이 많습니다.이들이 단순히 이런 방식을 좋아해서 일수도 있지만실상은 페이징이 그만큼 서버에 부하를 주기 때문에 trade-off 한 경우도 많다고 알고 있습니다.페이징 기법에 관한 문서나 성능 분석자료들도 많이 있구요그마만큼 글 목록 페이징이 성능에 미치는 영향은 큽니다...2. 뒷부분 페이지라고 사이트 성능에 영향을 덜 미치는게 아닙니다..이것도 글 하단에 목록을 표시할 때 적용되는 얘기인데요.글 목록을 표시한다고 해도 어차피 앞 페이지 글들 접근할 때는 빠르니까굳이 옛날 글 읽는 사람을 위해 이런걸 만들 필요가 있나 싶으실지도 모르겠습니다..그건 게시판 table 이 분리되었을 때는 어느 정도 일리가 있습니다만xe 는 좀 다릅니다. xe 는 게시판 모든 글을 한 table 에 넣어둬서 함께 느려지는 구조입니다..참고로 저는 게시판만 400개를 관리하고 있습니다.옛날 글 읽을려는 사람이 몇 명만 있어도반복된 table 단위 lock 때문에 다른 400개 게시판 글쓰기가 합동으로 느려지게 됩니다.좀 논외이긴 하지만 곰곰히 생각해보면 더 안좋은 케이스도 있습니다.글쓰는 사람이 한 명만 있어도 다른 400개 게시판의 목록 조회가 잠시나마 지연되게 되는거죠(오마이갓!)
뭐, 이건 xe 의 통합 table 과 mysql MyISAM 엔진의 근본적인 문제점이니 어쩔 수 없습니다.
xe 를 쓰는 경우, 조금이라도 query 를 빠르게 처리할 수 있다면 최대한 빠르게 해야한다는 이유가 여기 있습니다.목록 조회 query 가 금방금방 끝나면 좋지만, 이게 2~3초씩 걸리게 되면요청이 몰리면서 전체 사이트가 기하급수적으로 느려질테니까요..document_srl 이 빠르게 증가한다고 얘기한 것도 같은 맥락입니다.유효한 count 개수를 세야하는데 유효하지 않은 것들도부지기수로 table 에 뭉쳐있으니 xe 가 상대적으로 불리하다고 쓴 것입니다..xe는 document_srl 이 빠르게 느는 특징이 있으니까 이 기법을 도입하면다른 게시판에 적용했을 때보다 좀 더 성능향상 효과가 클 것이라고쓴 것이지 xe 구조를 바꾸자는 뜻으로 쓴 것은 아닙니다.단일 table 방식의 장단점을 고려해 봤을 때 전 사실 지금 이대로가 마음에 듭니다...또, 요샌 검색엔진이 발달해서 링크타고 잘 들어옵니다.예전 글들 조회수 보셨나요?쥐도 새도 모르게 조회수 마구 폭발하는 글들이 많습니다.이들은 반가운 방문자가 아니라 서버의 부담입니다.아마 해외 사이트 게시판들 중 목록 표시를 안하는게 많은 것도 검색엔진의영향이 커서 그런게 아닐까 싶네요..님의 사이트에서 맨 last 페이지로 가서 페이지를 이리저리 옮겨보세요페이지 옮기는거야 3~4초 걸리는 속도도 견딜만 하지만매번 글을 읽을 때마다 그 속도가 나온다면 어떠실거 같으세요?.저 같으면 다 떠나갈 것 같습니다..글 하단에 목록을 표시하는 다른 사이트들은 구조적으로 이런 문제점을 가지고 있습니다.알고리즘의 문제이지 캐싱이나 커널 튜닝으로 보완할 정도는 아닌것 같습니다. -
행복한고니
2011.04.19 09:55
좋은 제안이기는 하지만 XE가 CMS라는 사실은 간과하신게 아닌가 합니다.
전에 제로님이 말한 적이 있는데, MySQL만 사용하는 '게시판' 뿐이라면 얼마든지 빠르게 만들 수 있습니다.게시판을 빠르게 만드는 방법을 몰라서 XE가 느리다는 얘기를 듣는게 아닙니다. 그게 가능했다면 회사 내에 있는 뛰어난 DBA분들의 역량을 빌어 벌써 진작에 '초고속' XE가 나왔을 것입니다. 그러나 다양한 DB, 폭넓은 확장성, 하위호환성 보장 등을 다 고려하다보니 구조 개선도 힘들고 속도 개선도 어려운 거죠. ^^
참고로 예전에 어디선가 자료를 봤는데 '페이지 끝까지' 찾아보는 사용자의 비율은 상당히 적은 수준이라고 합니다. 그래서 굳이 첫페이지부터 마지막페이지까지 균등한 속도를 낼 필요는 없다고 합니다. 중요한 것은 처음 몇 페이지 정도라고 하네요.
-
redred
2011.04.25 01:52
행복한고니//행복한고니님의 의견을 요약하자면 다음과 같은 것 같습니다..1. XE는 CMS 지 게시판이 아니다. 게시판만 있다면 이것에 특화시켜서 훨씬 빠르게 만들 수 있다.2. 다양한 DB, 폭넓은 확장성, 하위호환성 보장 등을 고려하다보니 개발이 곤란하다.3. 페이지 끝까지 찾아보는 사람이 적으므로 그 실효성에 의문이 든다.한 가지 한 가지 제 의견을 달겠습니다..1. XE는 CMS 지 게시판이 아니다. 게시판만 있다면 이것에 특화시켜서 훨씬 빠르게 만들 수 있다..-> 이미 XE 테이블 구조를 보시면 게시판에 특화되어 있습니다.documents 테이블에 있는 is_notice 라는 필드 Wiki 에서 필요한가요?아니면 다른 어떤 모듈에서 유용하게 쓰이나요? 게시판뿐입니다.category_srl, readed_count, voted_count, trackback_count, uploaded_count 등 등도마찬가지입니다. 각각 인덱스가 걸려있는 것도 보시면 XE 는 게시판에 최적화된구조를 가지고 있습니다.이는 사내용 인트라넷을 만들든 커뮤니티 사이트를 만들든 게시판 구조가 가장 기본적이면서도포괄적인 기능셋을 갖고 있기 때문이라고 생각합니다.XE 는 사용자 니즈에 맞게 게시판을 주 타겟으로 잘 발전하였고 이 포괄적인 기능셋은얼추 다른 Wiki 나 달력, 연락처 등으로도 쓰일 수 있게 되었습니다.하지만 여러 모듈을 제공하는 CMS 라고 해도 그 근본은 게시판입니다..게시판 본연의 기능에 충실한 것이 마치 CMS 의 일부 옵션격인 기능에 충실하면 안된다고하시는 것 같습니다. 게시판은 CMS 의 Minor 나 Option 이 아니라 첫번째 Major 기능입니다.. 다른 모듈들에 피해가 가는 것도 아니고 기본 기능을 더 빠르게 하는건데
CMS 라는 개념적 울타리로 가능성을 제한하는 것이 이해가 가지 않습니다...2. 다양한 DB, 폭넓은 확장성, 하위호환성 보장 등을 고려하다보니 개발이 곤란하다.
-> 우선 이 기법의 특성에 대해 오해하신 것 같습니다.
이 기법은 MySQL 의 특정 옵션값을 변경시켜서 속도를 극대화한다거나
하는 tricky 한 방법이 아닙니다.전 윈도우 애플리케이션 개발자입니다. 그래서인지 웹 프로그래머들보다는알고리즘이나 자료 구조 등에 더 익숙한 편인것 같습니다.여기서 소개한 방법은 Dynamic Programming 이라고 불리는 보편적인 알고리즘의 하나입니다.똑같은 종류의 반복된 계산을 피하기 위해 미리 일정양 계산한 것을저장해 놓았다가 다시 그 값을 재활용하는 기법입니다..제가 알아본 바로는 Oracle 도 이와 같은 query 에 대해 느린 속도를 보인다고 합니다.MySQL, MS-SQL, Oracle 이 이렇다면 sqlite 나 cubrid 야 말할 것도 없겠지요이것은 일반적인 모든 DB 에 대한 지원입니다..다양한 DB 지원 때문에 개발이 까다롭다는 것은 이해가 갑니다.하지만 그것은 개발 단계에서 고민해야할 문제이지
기획 단계에서 고민해야할 문제는 아니지 않나요?개발이 까다롭기 때문에 기능 도입을 할 수 없다는 이유는 너무
개발자적인 마인드같다는 것입니다..차라리 유지보수가 어렵기 때문에 기능 도입을 할 수 없다고 하신다면 이해가 가겠습니다.유지보수는 기능개발과 달리 지속적인 비용이 드니까요.뭐, 제가 보기에 이 기법은 유지보수가 필요한 기능도 아닌것 같습니다....3. 페이지 끝까지 찾아보는 사람이 적으므로 그 실효성에 의문이 든다..-> 어느 정도 맞는 말입니다. XE 가 단순 게시판이라면 말이죠.XE 가 CMS 이므로 훨씬 큰 뭔가를 제공하는 것처럼 얘기하시는데정작 이런 가용성이나 수용 확장성에 대해서는 CMS 영역을 벗어난다고 선을 그으시는거 같네요..제가 이 기법을 얘기한 것은 뒷 페이지를 넘겨보는 사람에게 빨리 보여주기 위한 목적이 아닙니다.그렇게 이해하셨다면 잘못 전달된 것입니다..뒷 페이지 글을 읽는 몇 몇 사람으로 인해 전체 사이트가 느려지는 문제에대해 얘기한 것이란 말이죠.XE 의 단일 테이블 구조와 MyISAM 의 구조 때문에 생긴 치명적 단점입니다..이것에 반론이 있을 수도 있어 보이는데요.그렇다면 이 외에 게시판에서 생길 수 있는 DB bottleneck 은 무엇입니까?전 목록 얻기 외에는 게시판에서 생길 수 있는 bottleneck 을 못 찾겠습니다.
xe 전체를 통틀어서도 이것보다 더 큰 DB write exclusive lock 용 bottleneck 이 있나요?
.실효성이라.. 뒷 페이지로 가는 사람들 숫자는 차치하고서라도..
실효성 문제는 사이트 접속 로그를 보셔도 이해가 가실듯 싶습니다.
.네이버는 최신글만 주로 유입되는듯 싶지만, Google 은 오래된 글에도 잘 유입되더군요실제로 구글에서 아무 단어나 검색을 해보면 2000년도 문서들도 곧잘 나옵니다.Google 자체적으로 최신글에 가산점이 적은 특성인듯 싶습니다.
(제 사이트는 현재 24% 정도가 google 에서 유입되고 있습니다.)
.이것은 시간이 지나면 지날수록 불리해지는 게임입니다.그누보드야 게시판별로 나눠져 있으니까 그 확률이 현격히 떨어집니다만xe 는 계속해서 페널티를 짊어지고 가야되는 약점입니다...저도 개발자입니다.대체적으로 개발자가 구현 난이도나 복잡도를 보고 지레
기획을 잘라버리는 경우를 많이 보아왔습니다.이유야 이것저것 여러개를 들지만 실제 결론은 이미 처음부터 부정적으로 정해진 경우입니다..제가 그런 습관을 없앨려고 제 자신에게 반대 상황으로 되묻곤 합니다.이런 식으로요..WordPress 에서 이런 기능을 도입했다면 XE 에서도 넣을려고 했을까 안했을까?WordPress 는 이 기능을 넣었지만 XE 는 절대로 넣지 말아야할 이유가 있는가?.뭐 적절한 적용인지는 모르겠네요내일 아침에 일어나 읽어보면 이게 뭔 적용인가 싶을지도ㅋ.꼭 제가.. 왜 이 기능을 넣지 않느냐고 떼쓰는것 처럼 보이는데요ㅎxe 가 요즘 속도 올리기에 한창인 것으로 알고 있는데 정작 중요한DB bottleneck 은 넘기고 php, skin 최적화 쪽만 손보는 것 같아서 입니다..어차피 이 기능이 도입되지 않는다고 해도 전 제 사이트에만이라도 도입을 할 것 같습니다.퇴근하고 와서 짬짬이 하는거라 시간이 좀 걸리겠지만요
.
다른 의견이나 댓글 환영합니다. -
misol
2011.04.25 20:26
이 아이디어 나쁘지 않은 것 같은데..
잘 모르지만, 코어로 안되면 보드 모듈 자체 테이블을 따로 갖는건 어떤지요?.. -
redred
2011.04.27 21:18
저한테 물어보시는건지 아닌지는 모르겠지만-_-
음.. 제가 XE 구조는 잘 모르는데요
제 생각엔 document 쪽에서 처리해야되지 않나 싶네용
공용으로 쓰이는 거라 혼자 막 바꾸기엔 좀 그렇지 않나 싶어요. -
후후후호호호
2011.04.27 17:00
지나가다가 보고 글을 남깁니다..
전체적인 내용? 은 나쁘지 않다고 여겨집니다.
근데 이 답글에 오류가 있네요..
똑같은 연산을 피하기 위한 알고리즘은.. 메모라이제이션 입니다 ^^;
다이나믹 알고리즘은 귀납적 연산을 통해 값을 도출해내는 방법입니다.
자세한 내용은 위키를 참조해주세요. ㅎㅎ
그리고 웹프로그래머라고 알고리즘을 모르는건 아니랍니다..
남을 무시하는 발언을 하실 때는 좀더 심사숙고 해주세요. 그냥 지나가다 글을 남기는거라 좀더 심하게는 못하겠군요.. 수고하십쇼^^ -
redred
2011.04.27 21:51
무시하는 것으로 보였다면 죄송합니다.원글을 슬쩍 읽어보면 DB 최적화용 trick 인것으로만 읽힐 수 있어서
부연설명으로 보편적인 알고리즘이라는 얘기를 하다보니 나온 것입니다..
음.. 그리고 dynamic programming 맞습니다.memoization 이 dynamic programming 에서 쓰는 기법의 이름입니다.둘 사이는 포함관계입니다.위키 -> "메모이제이션 : 동적 계획법의 핵심이 되는 기술이다."
http://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98 -
후후후호호호
2011.04.29 13:02
동적계획법을 만들기위해서 사용하는 방법이지 그것이 동적계획법이다 란말을 아니지요. 그러면 덧셈 : 곱셈의 핵심이 되는 기술이다. 라면 곱셈은 덧셈인가요? -
redred
2011.04.29 22:38
dynamic programming 과 memoization 은 거의 같습니다.
제가 포함관계라고 적어서 그런지 dynamic programming 에
여러 기법이 있다고 생각하셨나 보네요
dynamic programming 에서 memoization 외에 따로 더 쓰는 기법은 없습니다.
둘 사이의 차이점이라면 dynamic programming 에는
optimal substructure 조건을 만족해야 한다는 규칙이 추가로 있을 뿐입니다.
굳이 비유를 들자면 "덧셈"과 "곱셈"의 관계가 아니라
"덧셈"과 "짝수의 덧셈" 이라고 표현해야죠.
이 기법이 dynamic programming 이 아니라고 주장하실려면
optimal substructure 조건을 만족하지 않는다는것을 증명하시면 됩니다. -
레이딘
2011.05.23 17:53
일단 게시판만 놓고 봐도, 이 방법은 XE에서는 문제가 있습니다. 이 방법을 사용하기 위해서는, 게시판과 DB 테이블의 구조가 동일해야 하고, 게시판의 Sort를 DB 테이블에 저장된 순서대로 고정해야 된다는 전제를 깔고 들어가야 합니다.
XE DB 구조 자체가 각 모듈이 단일 테이블을 사용하는 구조로 되어 있기 때문에, 이 방법을 적용할 경우 속도 이득을 보기 힘듭니다. 사이트 구성 시 게시판을 하나만 만드는 것도 아니고, 보통 수 개에서 수십 개를 만들게 됩니다. 이렇기 때문에 실제로 보여지는 게시판의 게시물 리스트와, DB에 저장되는 테이블 내용은 절대로 같아질 수 없습니다. 그리고 XE의 게시판은 테이블에 저장된 순서로 보여지는 것 뿐만 아니라, 그 역순의 Sort도 가능하고, 포럼형(마지막 답글이 달린 시간순) Sort 등등 여러가지 정렬이 가능합니다. DB 테이블 중간이나 끝쪽에 있는 내용이 1페이지에 올라올 수 있는 가능성이 생각보다 높다는 이야기입니다. DB 테이블의 순서를 무시하고 여기저기서 끌어온 뒤에 표시할 수 있어야 하는 것이 XE 게시판의 구조입니다. 그 때문에 범용성에 대한 이야기가 나온 거죠. -
redred
2011.05.27 01:12
단일 테이블 구조여야 하기 때문에 이 DB 구조와는 어울리지 않는다.
-> [세그먼트 값] [해당 세그먼트까지의 문서 개수] 같은 형식의 table 을 생각하셨나요?
당연히 게시판별로 따로 세그먼트 계산을 해야지요. 저는
[module_srl] [세그먼트 값] [해당 세그먼트까지의 문서 개수] 같은 테이블을 예상했습니다.
역순 sort, 포럼형 sort 도 있다.
-> 위에도 썼지만 모든 sort 방식을 다 지원할 필요가 없습니다.
자주 쓰이는 sort 방식에만 적용하면 되지 않을까요?
저는 최근글 순으로 update 시키는 세그먼트 테이블과
최근 업데이트 순으로 update 시키는 세그먼트 테이블 이렇게 2개 정도만 생각했습니다.
역순으로 탐색하는 사람은 어떡하냐구요?
이런 경우엔 아예 뒤에서부터 페이지를 세는 알고리즘을 쓰면 됩니다.
세그먼트 나누는 알고리즘으로 모든 DB 문제를 해결할 순 없습니다.
일반적으로 그런 만병통치 알고리즘은 존재하지 않습니다.
(근데.. 역순으로 탐색하는 사람 많이 있나요? 그냥 궁금해서 묻는 것입니다.)
성능에 도움이 될지 안될지는 이미 널리 알려져 있는 300만건 게시판을 참고해 보세요.
제가 알기론 예전 제로보드도 이것과는 좀 다르지만 세그먼트를 나누었다고 알고 있습니다.
인덱스도 이 알고리즘도 어차피 확률입니다.
update 시키는 부하가 더 클 것인가 조회하는 부하가 더 클 것인가 그 균형점을 잘 맞춰가야겠지요.
트위터처럼 write 가 read 보다 약간만 작다면 이런 방식이 안 좋겠지만
게시판의 경우 write 가 read 에 비해 현저히 낮습니다.
최근글 sort 의 경우 (게시물 개수 : 조회수) 가 (write : read) 비율이고
최근업데이트순 sort 의 경우 (댓글 개수 + 1 : 조회수)가 (write : read 비율)이라고 볼 수 있겠죠?
뭐 가능하다면야 최근글들은 모아서 한꺼번에 update 시킨다거나 할 수도 있겠구요.
이래저래 최적화시킨다면 충분히 최적화시킬 여지가 많은 알고리즘이라고 생각됩니다. -
레이딘
2011.05.29 20:39
말 그대로 대다수의 사용자가 최근글이나 최근 업데이트를 사용한다면 문제가 없겠죠. 그러나 XE는 DB를 게시판 형태로만 사용하지 않기 때문에 이 알고리즘이 맞지 않다는 이야기를 드린 겁니다. XE가 게시판 용도로만 개발되었다면 모르겠지만, 당장 블로그만 보더라도 역탐색으로 1번부터 보는 사람의 빈도가 게시판보다 높아집니다. 거기다 블로그는 태그나 카테고리, 검색의 중요성이 게시판보다 강조되기 때문에 저 알고리즘과는 맞지 않는 상황이 종종 발생합니다.
역탐색도 의외로 많이 씁니다. 예를 들어 게시판 형식인데 소설 연재 사이트라면, 첫 방문자는 당연히 게시판 맨 끝으로 가서 1번부터 거꾸로 봐야 합니다. 사이트 컨셉을 어떻게 잡느냐에 따라 역탐색이 필수가 되는 경우가 발생합니다.
거기다 위키라면 어느 게시물이 걸릴지 모르는 랜덤 억세스입니다. 위키 시스템 자체가 하이퍼링크로 게시물이 대단히 유기적으로 연결되어 있고, 검색을 기본으로 찾아야 하기 때문입니다. 그리고 트위터와 비슷한 방식의 플래닛이라는 모듈도 XE에 있습니다. 이 경우는 말씀하셨다시피 이 알고리즘과는 전혀 맞지 않게 됩니다.
XE 사용자가 어떤 방식으로 홈페이지를 만들고 운영할지 감을 잡지 못하는 상태에서 게시판만의 알고리즘 방법론을 이야기하는 건 좀 맞지 않는 이야기가 아닐까 생각됩니다. -
redred
2011.05.29 23:25
이 알고리즘을 모든 모듈에서 써야한다는 듯한 가정을 하고 계신거 같네요.
전 그렇게 얘기한 적이 없습니다. 그럴 필요도 없구요.
레이딘님이 앞에서도 구체적인 로직을 얘기하시길래 좀 더 얘기할께요.
각 게시판 설정에 '최근글순 페이징 인덱스 사용 여부', '업데이트순 페이징 인덱스 사용 여부' 이렇게 체크박스 2개 있으면 될것 같습니다.
말씀하신대로 역탐색 페이징이 그토록 필요하다면 그것도 옵션으로 추가하면 되겠지요. 소설 연재 사이트의 경우 처음부터 보는 사람의 수요도 많겠고 최근 소설을 읽을려는 사람도 많을테니 세그멘테이션을 나누는 이 알고리즘이 더 빛을 발하겠네요.
또, document 모듈 쪽에 query 를 추가하면 기존 타 모듈과 충돌이 나지도 않겠구요.
board, bodex, pxeboard 에서 공통으로 쓰일만한 query 라서 각기 따로
쓰는 것보다 core 쪽 document 에서 하나로 관리하는게 더 나을것 같습니다.
제가 xe 구조를 훤히 아는게 아니라서 틀릴 수도 있습니다만 제가 이해한 바로는 그렇습니다.
제가 질문을 드려도 되겠습니까?
게시판만을 위한 알고리즘이 왜 문제가 된다는 것인지 이해가 안갑니다.
게시판 모듈에서만 쓸 query xml 이 core 에 추가되는 것이 하드 용량에 아깝다는 것인가요?
다른 모듈이 안 쓰는 기능에 개발자 리소스를 투입하는게 아깝다는 것인가요? -
레이딘
2011.05.30 13:29
전 XE의 구조를 보는데 왜 게시판만 보고 계시는지 그게 더 궁금해서 본문부터 다시 따져보니... 이건 기획자와 개발자, 또는 개발자 사이에서 발생하는 전형적인 커뮤니케이션 오류인 듯 하군요. 주로 이 오류는 기획서나 제안서 등에 중요한 내용이 빠졌을 때 발생을 합니다.
"그렇게 얘기한 적이 없습니다." 이 말을 개발자라고 이야기하시는 분에게서 듣다니 대단히 놀랍습니다. 저 문장은 개발자나 기획자는 써서는 안 되는 말입니다. 제목과 본문을 보면 그렇게 이야기 한 적은 없습니다. 이 말은 맞죠. 그러나, "게시판만을 대상으로 한다"라는 언급을 제목이나 본문에 명확히 이야기 하지 않으셨습니다. 본문 상에 드러나는 것으로는 충분하지 않습니다. 비유법이나 반어법 등을 사용하는 소설이 아니라, 이런 알고리즘이 어떤 지에 대한 제안을 하시는 겁니다. 무엇에 대해 제안할 때 그 제안 대상을 명확히 규정하지 않고 글을 쓰시는 건 크게 잘못된 겁니다. -
redred
2011.05.30 21:03
기획자와 개발자의 커뮤니케이션이 단방향이 아니라는 것도 아시죠?
"그렇게 얘기한 적이 없습니다." 라는 것은 책임을 회피할려고 쓴 말이 아닙니다.
A + B 라고 얘기하지 않았는데 님은 A + B 라고 이해한 것입니다.
실상 저는 A 라고 생각하고 글을 전개한 거구요.
주어가 빠져있거나 잘못되었다면 그것은 일차적으로 제 책임입니다.
하지만 그 주어에 대해서 확신이 서지 않는다면 저에게 되물었어야 하지 않나요?
님은 말씀하신대로 주어가 명확하지 않았다고 하셨습니다.
그러고는 A + B 라고 혼자 내린 가정하에 글을 쓰셨고
결국 저에게 왜 A 라고 진작에 쓰지 않았느냐고 하시는 것입니다.
님이 쓰신 글들을 읽어보세요.
전 얘기도 안한 테이블 스키마가 이대로는 문제가 있다고 얘기하시고,
위키나 타 모듈에 대해서도 얘기 안 했는데, 이에 대해서 이의를 제기하셨습니다.
이런이런 문제가 있다고 이의를 제기하기 이전에
이런 의도로 말한게 맞느냐고 묻는게 먼저였어야 합니다.
뭐, 다른 회사는 어떤지 모르지만 저와 기획자는 이렇게 양방향으로 얘기합니다.
레이딘님은 안 그러시나요?
서로 넷상에서 글로만 전하다보니 커뮤니케이션에 오류가 있을수 있죠.
충분히 가능한 일입니다.
하지만, 누구도 누구를 이해시켜야할 의무는 없다고 생각합니다.
서로 능동적으로 상대방의 의도를 캐치할려고 더 대화를 하는게 낫지 않을까요? -
레이딘
2011.05.30 22:55
A + B로 이야기하신 것이 아니라, A를 이야기하는 데 처음부터 가장 중요한 내용을 빼고 쓰셔서 B라고 이해한 상황입니다. 제안을 할 때 목표점 자체를 빼놓는 것은 기본중의 기본을 지키지 않았다는 이야기입니다. 그러니 이야기가 잘못 흘러 그렇게 오해를 하게 되는 거죠. 그리고, DB에 대해서 이야기를 하는데 테이블 구조에 대해서 이야기 안하는 것도 이상하군요. (테이블 스키마라고 이야기하셨는데, 전 정확히 테이블 구조를 이야기 한 겁니다.) 그러면 본문에 테이블 구조가 들어 있는 링크는 왜 하셨습니까? 전 링크까지 꼼꼼히 읽어보고 인터넷에서 관련 자료를 더 찾아본 뒤에 아무리 봐도 이건 게시판의 특정 상황에 관련된 알고리즘이라고 결론을 내리고 반론을 제기한 겁니다. 테이블 구조가 이 글에서 이야기하고자 하는 주제와 관련없다면 "그쪽은 제외하고 보세요"라고 본문에 첨가해야죠. 그리고 위키나 타 모듈에 대해서도 이야기 안하셨다고 하셨는데, 중간의 행복한고니님에게 단 답글에 위키 모듈을 언급하시고 XE DB 구조가 게시판에 최적화되어 있다는 언급은 왜 하셨습니까?
냉정하게 말씀드리자면, 제안서에서 기본적인 것을 빼먹거나 잘못 썼을 경우 몇몇 사람들이 B라고 이해해 버리면 그건 전적으로 맨 처음 글 쓴 사람의 책임입니다. 기획자와 개발자의 커뮤니케이션은 단방향이 아니지만, 항상 양방향이 될 것이라고 생각하셔도 곤란하고, 자신의 글의 실수에 대해서 다른 사람들이 물어보거나 지적해 주는 것을 항상 바랄 수는 없습니다. 특히 저와 redred님은 같은 팀도 아니고 아는 사람도 아닌, 남남입니다. 제가 왜 redred님께 그런 것을 제 시간을 들여서까지 일일히 지적해야 하는지 오히려 되묻고 싶습니다. 그건 모르는 사람에 대한 예의가 아닙니다. -
디제이쿠
2011.05.24 12:20
"개발 단계에서 고민해야할 문제이지기획 단계에서 고민해야할 문제는 아니지 않나요?개발이 까다롭기 때문에 기능 도입을 할 수 없다는 이유는 너무
개발자적인 마인드같다는 것입니다."
좋은 말씀이십니다..
좋은 개발자이십니다..
-
redred
2011.05.27 01:19
ㅎㅎ다시 읽어보니 제가 좀 강경한 투로 쓴거 같네요
개발자 그만하고 기획자 되고 싶어요 -_-;; -
매력적인분석
2011.05.30 04:13
헐.............. 댓글이 완전 고수들의 전쟁같군여;;
많이 깨우치고 갑니다. ~ ^^
저같은 경우는 최근 갱신순을 쓰는데, 이런 경우는 또 달라질수 있겠지요.
정렬에 따라서 segment 를 다 만들어주는 방법은 조금 논의의 여지가 필요하다고 생각합니다.
그것보단 게시물등을 memcached 등에 올려서 캐싱을 하는 방법이 좀더 효율적이지 않을까요?