mysql 랭킹 뷰 구현 문의드립니다. 0 2 1,386

by Kun [SQL Query] mysql rank [2022.09.02 16:55:23]


안녕하세요. 이전에 글을 남겼었지만 아직 해결을 하지 못해 다시 문의드립니다..

우선 mysql을 사용중이고, 큰 그룹 안 작은 그룹 안에서 유저의 수를 카운팅 하여 높은 순서로 랭킹을 매기려고 합니다.

 

Group_user ( BigGroup, SamllGrop, userId ) 이런식으로 테이블이 구성되어 있습니다.

BigGroup, SamllGrop, userId은 [1,1,1], [1,1,1] ,[1,1,2] 처럼 중복이 가능합니다!

 

이러한 경우에 빅그룹 안 스몰그룹에서 userId가 가장 많은 순서대로 랭킹을 매기려고 하는데 속도가 너무나 느린데 해결방법을 찾지 못하겠습니다..

 

아래는 제가 짠 쿼리인데 속도가 1-2초 정도 나옵니다.

뷰로 사용할거라 추가적인 where절은 붙지 않고, 검색에 사용해야해서 속도가 최대한 줄었으면 좋겠습니다.

 

인덱스는 (BigGroup, SamllGrop, userId) 입니다!

 

데이터는 현재 약 40만건 정도 있습니다!

 

SELECT bigGroup AS `bigGroup `, smallGroup AS `smallGroup `, userId AS `user`
        , row_number() OVER (PARTITION BY bigGroup, smallGroup ORDER BY A.counter desc ) AS `rank` 
        , count(0) OVER(PARTITION BY bigGroup, smallGroup ) AS `cnt`
    FROM (
        SELECT `groupUser `.`bigGroup` AS `bigGroup`, `groupUser `.`smallGroup` AS `smallGroup`, `groupUser `.`user` AS `user`
            , count(0)  AS `counter` 
        FROM `group_user` `groupUser` 
        GROUP BY `groupUser `.`bigGroup`, `groupUser `.`smallGroup` , `groupUser `.`userId`
    ) `A`

 

 

해당 쿼리에 대한 해결 방법이 아니더라도 실시간 랭킹을 어떻게 구현해야할지에 대한 조언이라도 부탁드리겠습니다..!

by 신이만든지기 [2022.09.02 18:01:40]
 SELECT biggroup, smallgroup, userid
      , count(1) AS cnt
      , row_number() OVER(PARTITION BY biggroup, smallgroup ORDER BY count(1) DESC) rk
    FROM group_user
 GROUP BY biggroup, smallgroup, userid;

이걸 원하시는 건지 모르겠네요?


by Kun [2022.09.02 23:39:25]

작성해주신 코드도 이미 이전에 확인해보았는데, row_number를 먼저 할 경우 오히려 속도가 감소하는 현상이 있었습니다 ㅠㅠ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입