쿼리 날릴 때 rand()로 정렬을 하면 데이터 량이 조금만 많아져도 큰 부담이 되는 것으로 알고 있습니다.
지금은 회원들 중에서 친구가 아닌 회원들을 랜덤으로 뽑아서 추천해주는 기능을 만들고 있는데요.
그러다보니 ORDER BY rand()에서 딱 걸리더라구요.
그러다 스택오버플로우에서
https://stackoverflow.com/questions/1823306/mysql-alternatives-to-order-by-rand#answer-36013954
https://stackoverflow.com/questions/1823306/mysql-alternatives-to-order-by-rand#answer-40780130
이 두 가지 답변을 봤습니다.
이해한 바로는 테이블에서 미리 랜덤으로 (원하는 갯수만큼?) 데이터를 뽑아와서 테이블에 조인시켜서 범위를 축소시키는 것 같은데 이거는 부하가 덜 걸리는 건가요?
암튼 이런 접근이 실제로 효과가 있는 건가요? 그리고 어떤 점에서 유리하다는 건가요?
궁금합니다!
최종 갯수를 지정하여 가져와서 처리한다면 이렇게 하면 되겠네요..
보통 rand()자체가 오래걸리는 문제는 당연히 처음부터 모든 회원을 전부 통째로 가져오는 문제점때문일겁니다.
그래서 저기에서 말하는건 member_srl을 전체 갯수중에 일부 시작점 + 끝점 해서 일부를 가져온다음 그부분에서 rand를 돌린다 이런 개념으로 보면되는데요..
예를들어 현재 최대 시퀀스값을 가져온다음 1부터 최대시퀀스 까지 랜덤을 돌려서 나온 숫자를 가지고 가려내면 되겠지요.
그래서 만약 50이 떴다면 50 + 100 해서 50~150까지 포함되어있는 member_srl 값을 가져온다 이런식으로요..
이렇게 하면 최대 많아야 100명이고 갯수를 줄일 수 있겟지요.(최대 랜덤은 100을 넘기지 않는게 좋긴해서..)
근데 회원가입현황이 많이 없는 상황이라면 시퀀스가 100개 넘어가도록 회원가입한 적이 없다면 0명일 가능성이 있습니다. 이렇게 하면 무한적으로 계속 반복될 수 있어서...
사이트 마다 그 랜덤에 사용될 갯수를 적절하게 설정하여 사용할 수 있도록 제공해주는 편이 나을수 있겠습니다.
랜덤으로 뭔가 뽑아온다는 거 자체가 좀 애매하긴해요 ㅎㅎ
특히 RX와 같은 경우라면 getNextSequece함수로 고유번호를 다 등록해놓는 구조이다보니 아에 index를 지정하여 넣는 방식보단 제작도 까다롭구요 ㅋㅋㅋ
아 아니면.. 최소값에서 최대 srl값을 가져왔을때 진짜 마지막 높은 숫자 나오기전까지는 모르겟지만 listcount 를 20개로 돌려서 그걸 새로운 array쪽에 새롭게 데이터를 몰아넣은다음 index 값을 rand으로 한번더 추첨 해주는 방식으로 들어가면 좀더 깔끔하겠어요. (이때 offset 쿼리방식으로 page변수를 쿼리로 넣지 않도록 주의해주세요.)