일단 화면 출력 설정에서 태그를 랜덤이 아닌 인기도 등으로 변경하면 부하가 줄어든다는;;;
제 의도는 안쓰는게 아니라 쓰되 효율적으로 갈수 있는 부분이 있지 않을까하는 부분이였습니다. ^^;
랜덤태그 매력있는 놈인데 안쓰기에는 아깝죠.
아직 로그인하지 않았습니다. 로그인 또는 회원 등록을 해 주시기 바랍니다.
TNF : Tatter Network Foundation forum » 영민C가 작성한 글
페이지 1
일단 화면 출력 설정에서 태그를 랜덤이 아닌 인기도 등으로 변경하면 부하가 줄어든다는;;;
제 의도는 안쓰는게 아니라 쓰되 효율적으로 갈수 있는 부분이 있지 않을까하는 부분이였습니다. ^^;
랜덤태그 매력있는 놈인데 안쓰기에는 아깝죠.
금일 운영중인 블로그의 페이지 로드 속도가 엄청 느려지며 급기야 서버의 cpu점유율이 100%을 향해 계속 치닫는 상황이
발생 하였으며, mysql프로세스를 체크하던중에 아래의 쿼리가 엄청난 지연시간을 가져오며 이로인한 원인이라 판단하여
쿼리를 수정후(수정한 쿼리는 운영중인 블로그에 맞게 임의대로 수정한 것임) 문제가 사라지게 되었으며, 타 쿼리들은 모두
이상없이 처리 되고 있었습니다.)
먼저 mysql프로세스에서 계속 물려 있던 쿼리는 다음과 같습니다. (태그 뿌려주는 쿼리죠)
SELECT `name` FROM `{$database['prefix']}Tags` t,
`{$database['prefix']}TagRelations` r,
`{$database['prefix']}Entries` e
WHERE r.entry = e.id AND e.visibility > 0 AND t.id = r.tag AND r.owner = $owner
GROUP BY r.tag
ORDER BY RAND() $aux
위 쿼리에서 사용된 테이블의 레코드수를 보면
entries테이블에는 약 1990여개의 레코드
tagrelations테이블에는 약 3400여개의 레코드
tags테이블에는 약 2000여개의 레코드를 가지고 있는 상황입니다.
(문제가 되었던 블로그 외에 2개의 블로그를 더 운영중이지만 해당 레코드수가 적어서 그런것인지는 몰라도 나머지 블로그
는 해당 쿼리가 모두 정상 처리 되고 있었습니다.)
이상이 없다가 갑자기 발생한 일이라서 다른 원인이 있을수 있겠지만(다른 원인과 우연히 겹쳐서 발생한 일일수도 있고...) 쿼
리 수정후 문제가 없어졌기에 이렇게 글을 쓰게 됐습니다.
mysql에 발만 담근 정도라 어떠한 생각을 말씀드리는것도 어려운 상황이라 이부분에 있어 한번 체크를 해주시면 어떨까 합니다.
개선사항이 추가 되었습니다.
기존에 MySql 4.0.x대 버젼에서는 서브쿼리 미지원으로 인하여 작동하지 않던것에 대해 따로 서브쿼리 미지원 버젼에서
사용할수 있는 페이지를 추가 하였습니다.(기존 쿼리에서 서브쿼리를 사용시 내부적으로 임시테이블을 생성하여 처리가 되는데
이를 강제로 처리하는 방식으로 추가 하였습니다.)
중요한점으로는 이렇게 사용할시에는 꼭 TagRelations테이블의 entry필드에 인덱스를 잡아주어야 합니다.
이 방식으로 인덱스가 없을 경우 있는 경우보다 쿼리 실행 시간이 약 5배 차이나는것으로 확인 되었습니다.
영민C 작성:오늘 태터 플러그인 게시판에 배포하였습니다.(역시 플러그인에 발만 담근 정도라 오류가 발생할수도 있겠지만요.)
큰 수정사항은 없었고 인덱스 유무가 관건이였는데 필수보다는 권장사항쪽으로 무게를 두었으며, 필수이면 좋겠지만
이 부분에 접근하기 힘드신 분들이 더 많을꺼라는 생각에서 그렇게 되었습니다.수고하셨습니다. 완벽한 코드는 세상에 없으니, 문제가 생기면 같이 포럼에서 머리를 맞대고 해결해 보도록 해요.:)
관심가져주셔서 감사합니다. 요즘 웹 2.0 경제학이라는 책을 읽고 있는데
웹 2.0 = 블로그 = 태그 나름대로 이런 공식도 성립시켜 보게 되네요.
태그 정말 멋진 녀석인것 같습니다.
오늘 태터 플러그인 게시판에 배포하였습니다.(역시 플러그인에 발만 담근 정도라 오류가 발생할수도 있겠지만요.)
큰 수정사항은 없었고 인덱스 유무가 관건이였는데 필수보다는 권장사항쪽으로 무게를 두었으며, 필수이면 좋겠지만
이 부분에 접근하기 힘드신 분들이 더 많을꺼라는 생각에서 그렇게 되었습니다.
윈도우서버 APM으로 했을때 테이블명 대소문자 구분없이 잘 작동하는데 그 외에는 대소문자가 명확해야 하는... ㅠㅠ
대소문자 구분하여 수정해 놓았습니다.
관련글 리스트 불러오는 부분에 비공개글도 포함이 되어 이부분 조건절에 추가하였습니다.
영민C 작성:Ikaris C. Faust 작성:index.php파일에서 쿼리를 추출해가지고 실제 쿼리로 변환시킨 후 PHPMyAdmin에서 돌렸습니다만, 테이블명 대소문자를 엄격하게 가리는군요. MySQL 5.0환경입니다.
이 플러그인이 설치된 서버의 mysql도 5.0입니다. 물론 대소문자 상관없이 처리가 되었구요.
직접 mysql command line clinet에서 select명령으로 간단히 조회를 할때도 대소문자를
구별하지 않고 있구요. 어떤 다른 환경 차이가 있는것 같은데... 거기까지 생각을 못해서 죄송합니다.죄송하시다니요;;
저는 이 플러그인으로 nested join에 관해서 알게 되었는걸요.
오히려 제가 더 감사하죠.
음 제가 쓴게 그런것이였군요. ^^;
Mysql 접하는게 몇년전 select만 날려본것을 끝으로 첨이라 삽질중입니다.(DB에 대해선 발만 담근정도라.
)
기회가 되시면 인덱스의 유무에 따라 mysql프로세스 모니터링을 한번 해보셔도 좋을것 같습니다.
아시겠지만 그냥 적습니다.
프로세스 리스트는 mysqladmin -u계정 -p패스워드 processlist -i5(시간 초단위입니다.)
이때 각 실행쿼리데 대한 프로세스를 보실수 있구요(time은 계속 올라가고 프로세스에 계속 물려있는 쿼리가
있다면 비효율적인 쿼리라 볼수 있겠죠.)
영민C 작성:Ikaris C. Faust 작성:에러가 납니다.
TAGRELATIONS 이렇게 테이블명이 대문자로 되어있어서 그런지, MySQL이 doesn't exist 랍니다.
TagRelations와 Entries, Tags 이렇게 대소문자 구분이 되는 것 같습니다.Alter명령어를 날리실때 그런것인지요? 아니면 플러그인 설치후 안되는 것인지요?
알려주세요.index.php파일에서 쿼리를 추출해가지고 실제 쿼리로 변환시킨 후 PHPMyAdmin에서 돌렸습니다만, 테이블명 대소문자를 엄격하게 가리는군요. MySQL 5.0환경입니다.
이 플러그인이 설치된 서버의 mysql도 5.0입니다. 물론 대소문자 상관없이 처리가 되었구요.
직접 mysql command line clinet에서 select명령으로 간단히 조회를 할때도 대소문자를
구별하지 않고 있구요. 어떤 다른 환경 차이가 있는것 같은데... 거기까지 생각을 못해서 죄송합니다.
아직 소스를 못 보았습니다만, 선쿼리 없이는 어떻게 구현을 못하려나요?
TGIF는 TagRelations에 별다른 수정이 없었는데...
TGIF랑은 차원이 다른 건가?
TagRelation의 경우 테이블에서 자료를 가지고 작업을 하는데
이때 특정 필드에 인덱스가 없어 이를 추가한 것입니다.
(그냥 플러그인 설치해도 작동은 합니다 하지만 권장해 드리고 싶지 않구요)
인덱스 유무를 파악하여 처리할 수 있을지 알아보겠습니다.
그리고 데이터가 수만건이 아니시라면 큰 이상 없을거라 생각합니다.
- 혹시 "새 사용자" 이거 못 바꾸나요? ㅡㅡ; 글쓰고 보니...
영민C 작성:TagRelation의 경우 테이블에서 자료를 가지고 작업을 하는데
이때 특정 필드에 인덱스가 없어 이를 추가한 것입니다.
(그냥 플러그인 설치해도 작동은 합니다 하지만 권장해 드리고 싶지 않구요)인덱스 유무를 파악하여 처리할 수 있을지 알아보겠습니다.
그리고 데이터가 수만건이 아니시라면 큰 이상 없을거라 생각합니다.- 혹시 "새 사용자" 이거 못 바꾸나요? ㅡㅡ; 글쓰고 보니...
아하, 그렇군요.
저는 DB쪽에는 지식이 그리 깊지 못해서요.이름표는 글 수에 따라 달라집니다.
인덱스 없이 그냥 할 경우에는 mysql프로세스에서 해당 쿼리의 time이 계속 올라가게
됩니다. 물론 좋은게 아닙니다. relations테이블의 entry필드가 데이타를 가져오기 위해
필요한 필드이다 보니...
에러가 납니다.
TAGRELATIONS 이렇게 테이블명이 대문자로 되어있어서 그런지, MySQL이 doesn't exist 랍니다.
TagRelations와 Entries, Tags 이렇게 대소문자 구분이 되는 것 같습니다.
Alter명령어를 날리실때 그런것인지요? 아니면 플러그인 설치후 안되는 것인지요?
알려주세요.
페이지 1
TNF : Tatter Network Foundation forum » 영민C가 작성한 글