안녕하세요. 이전에 글을 남겼었지만 아직 해결을 하지 못해 다시 문의드립니다..
우선 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`
해당 쿼리에 대한 해결 방법이 아니더라도 실시간 랭킹을 어떻게 구현해야할지에 대한 조언이라도 부탁드리겠습니다..!