-
Notifications
You must be signed in to change notification settings - Fork 53
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[조회 성능 개선하기] 검프(김태정) 미션 제출합니다. #6
Conversation
1. 위와 같은 상황에선, 어떠한 것을 기준으로 index를 둘지 말지 결정해야 할까요? (현재 실행 속도는 동일합니다.) 그리고 성능최적화가 되지 않은 이유는 24row밖에 안 되는 테이블이라, 풀테이블스캔과 인덱스 스캔간의 성능차이가 무의미한 수준이기 때문이라고 봅니다. 2. 이렇게 COUNT 쿼리의 최적화가 필요한 경우, 카디널리티가 낮은 컬럼의 인덱스를 고려할때, |
미션 제출부에선 흠잡을 곳이 없어보입니다. unique에 대해선 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
리드미 보기가 정말 편했어요! 검선생 다운 멋진 정리네요~~ 수고하셨습니다!
전 이번에 정말 많이 배우고 느꼈는데, 검프도 마찬가지겠죠? ㅎ_ㅎ
코멘트로 질문에 대한 대답과 미션에 대한 리뷰 남겼습니다~~ 확인해주세요~!
안녕하세요 웨지!! 두 번째 PR이네요. 수정사항 - 쿼리 개선애매하게 요구사항을 만족하는 (0.9/sec)쿼리를 개선했어요. 대체로 인덱스, 유니크 설정을 잘못해서 생기는 레이턴시였어요. 리뷰시 참고아직 리뷰 과정이기에, 결과 자체가 변경된 부분에 대해서는 - 표시를 했어요.
TEXT가 65,535 byte까지 지원을 한다고 합니다. 병원 이름이 암호화가 되지 않는 이상 이정도까지의 데이터가 들어오지 않을 것이라 생각했어요. 그래서, 타입을 변경해도 좋지 않을까? 생각했어요. 마침 인덱싱을 하려 했었고요!! ㅎㅎ 질문했던 부분들에 대한 피드백을 확인했어요! |
^^ 딱히 피드백 할 게 없네요 이것저것 인덱스를 잡다 느낀 것이 인덱스 칼럼의 분포도 또한 중요하구나 하는 내용이었습니다. programmer의 member_id라는 칼럼이 있습니다. 선택도가 0.3정도 되는 칼럼이 있습니다.(33만 건 중 유니크 값이 10만건여) 반면에 선택도가 0.01(32건)정도 되는 칼럼이 있습니다. hospital_id로, 각 건이 1000~10000건 row 사이로 분포가 어느정도 균일합니다. 인덱스는 카디널리티가 높은 걸로 잡아야 한다는 인식 덕분에 member_id로 잡아봤지만, 분포도가 균일한 hospital_id 인덱스보다 성능이 훨씬 떨어지는 현상을 확인했습니다. 인덱스라는 것이 PK와 맵핑되는 세컨더리 테이블이므로(INNO DB 한정이지만), 분포도가 지나치게 편중된 칼럼은 세컨더리 테이블 내에서 검색시에 B-TREE의 검색효율 성능을 충분히 낼 수 없기 때문이라고 생각합니다 ^_^ approve 하겠습니다! 수고했어요~~ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여윽시 검선생이다
어프로브
안녕하세요 웨지!! (거의 마지막일듯한) PR입니다. ㅎㅎ 수정사항 - 쿼리 개선
수정사항 - 리드미 수정수정사항들을 제거 후, 처음 PR을 날렸을때와 같은 구조로 수정했어요. 피드백에 웨지의 생각들을 말씀해주셔서 좋았어요!! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
검짱왕킹프킹짱왕 리뷰를 완료할 땐 머지가 안 되어서 잊고 있었네요! 뒤늦은 머지 선물~~ 얼마 남지 않은 우테코 기간 같이 화이팅해부자~~!
안녕하세요 웨지 ㅎㅎㅎ 검프입니다!
페어 꼭 하고싶었는데, 리뷰이, 리뷰어로 만나네요!! 반갑습니다 :)
편하게 보실려면 조회 성능 개선하기 여기서 볼 수 있습니다!
미션을 진행하며 질문사항이 생겼어요 먼저 질문사항 적을게요.
PR 질문사항.
A. 쿼리 연습
부서 테이블에 이러한 인덱스를 걸었을때 아래와 같은 실행계획이 나오는데요,
부서 관리자의 rows가 24개가 불러와 지는 것을 알 수 있어요.
전반적인 filtered를 고려했을 때, 위와 같이 걸어도 괜찮다고 생각을 했었는데,
인덱스를 걸지 않았을 때는
부서의 extra가 Using where, Using tempoarary, Using filesort로 바뀌어요. filter의 퍼센트도 11퍼로 대폭 줄었네요.
다만 rows를 9개만 가져오기 때문에, rows의 최적화가 이뤄지지 않나 싶어요.
위와 같은 상황에선, 어떠한 것을 기준으로 index를 둘지 말지 결정해야 할까요? (현재 실행 속도는 동일합니다.)
B. 인덱스 설계
boolean을 인덱싱해야하나? 라는 질문의 답에, 저는 일단 Boolean은 카디널리티가 낮아, 설정하지 않는다 라고 결정했어요. 하지만 Count 쿼리에서 성능향상을 위해서는 Unique 제약조건과 indexing을 해줘야하기에,
primary인 id와 boolean 컬럼을 복합 Unique 키로 걸었어요.
이렇게 COUNT 쿼리의 최적화가 필요한 경우, 카디널리티가 낮은 컬럼의 인덱스를 고려할때,
어떤 기준으로 둬야할까요? 웨지의 생각이 궁금해요!
결론적으로
JOIN문을 작성하는법, Index를 제대로 쓰는 방법을 미션을 진행하며 점차 체득화 된거 같아요. 그래서 초반에 어색한? 쿼리들이 있는데, 이부분들은 웨지의 폭풍 피드백을 받으며 수정하고 싶어서 남겨놨어요 😊
이번 피드백 잘 부탁드립니다!! 🙇🏻♂️