okky1922
227
2019-05-17 15:06:44
3
252

MYSQL INDEX



MYSQL INDEX 관련 질문 드립니다 ~


Mysql 에서 INDEX를 걸려고 하는데 1,2번방법 차이가 있는건가요?


정상적으로 INDEX 지정하는게 1번이 맞는건가요?


1
0
  • 답변 3

  • 르매
    560
    2019-05-17 16:40:43

    인덱스는 목적을 갖고 만듭니다.

    따라서 목적에 잘 부합하게 만든 인덱스인지 아닌지는 평가할 수 있어도.. 저렇게 "어떤 인덱스가 맞는가?"라고 질문하시면 아무런 답도 드릴 수 없습니다.

    이전 글을 보니.. 레코드가 많은 글을 빠르고 가볍게 count(*) 하는게 목적인 듯 한데요.

    이전 글에서 얘기하신 것처럼.. SELECT COUNT(*) 의 결과가 800만건 정도되면.. 그건 자주 실행되면 안되는 쿼리입니다. (수십만건 정도만 돼도 자주 호출하는 건 무리..)

    WHERE 절을 만족하는 최소 컬럼에 인덱스를 생성해서 I/O를 다소 줄일 수 있겠지만.. 그래도 실시간으로 count하는 건 피하는게 좋겠습니다.

    MS-SQL이라면 indexed view로 해결할 수 있는데.. MySQL이다보니..

    댓글에 있었던 것처럼.. 집계 결과를 유지하는 별도의 테이블을 고려해 보시는게 좋을 듯 하네요.

     


    0
  • okky1922
    227
    2019-05-18 12:35:29

    르매 답글을 늦게 확인했네요

    이게 실시간 데이터를 count 해야되서 별도의 테이블 만드는것에 대해 한계가 있네요 ㅠㅠ..

    근대 쿼리문 속도는 1초도 안걸리는데.. 이게 MySql Cpu 과부하의 영향이 있을까요?..

    Mysql CPU 사용량이 300퍼가 넘는데 모든 쿼리문이 2초이상 걸리는게 없습니다..


    0
  • 르매
    560
    2019-05-18 15:54:22 작성 2019-05-18 16:06:57 수정됨

    물론 어떤 서비스냐에 따라 차이가 있습니다만.. 쿼리 응답 시간은 보통 수십 ms 단위에서 왔다 갔다하고, 수백 ms 짜리 쿼리면 꽤나 무거운 쿼리로 분류할 텐데요.. 이런 종류는 정말 뜸하게 호출되도록 신경을 써 줍니다.

    그리고 DBMS는 주로 I/O가 병목이라서.. 이쪽에 한 번 병목이 생겨서 밀리기 시작하면 CPU는 덩달아 올라가는 패턴이 많습니다.

    1초 안걸리는 쿼리인데 CPU 과부하 원인이 되냐고 하셨는데.. 그럴 수도 있고 안그럴 수도 있죠.

    결국 무거운 쿼리가 얼마나 자주 호출되는가와 관련이 있고, 통상 무거운 쿼리라는 것은 I/O가 많이 발생하는 쿼리가 대부분인데, count() 는 전형적으로 I/O 집약적인 작업이기 때문에.. 되도록 실시간으로 집계하는 것을 피해야 한다고 조언드린 겁니다.


    예를 들어 게임에 보면 실시간 랭킹 같은게 있죠?

    이것도 내 점수보다 높은 플레이어의 수를 count 하는 겁니다.
    왠만큼 흥행한 게임은 내 순위가 수십 ~ 수백만등으로 나올 수 있는데, 그럼 이게 실제로 매번 count한 결과일까요?

    물론 별도의 랭킹 서버를 구축했다면 실시간일 수 있지만, 그냥 RDB에서 랭킹을 구한다면.. 이걸 매번 count하게 만들진 않습니다. DB가 버티지 못하니까요.

    그래서 점수별 플레이어 수에 대한 집계표를 주기적으로 갱신하고, 내 점수가 몇 등에 해당하는지 러프하게 보여주는데, 이 순위가 100위 안으로 나오는 경우에만 실시간으로 다시 count해서 진짜 랭킹을 보여주는.. 하이브리드 방식을 사용하게 됩니다.

    어떤 컨텐츠인지는 모르겠지만, 실시간의 허용 범위를 잘 협의하는 것도 필요한 일입니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.