안녕하세요! 대용량 테이블에 대해서 도움을 받고 싶습니다~ 0 4 725

by 재팬종쿤 [MySQL] MySQL5.6 Database [2018.11.27 10:40:36]


안녕하세요.

대용량 테이블이 될 것 같은 느낌이 드는 기능이 있어서 글을 올리게 되었습니다.

바로 본론으로 들어가겠습니다!

저희는 건물을 관리해주는 서비스를 운영하고 있습니다.

건물 수를 추려내보면 5천 건이 조금 넘습니다.

만들어야 할 기능으로써는,

1. 모든 건물의 입주율(방이 20개 인데, 실제로 계약되어 있는 방은 15개 -> 0.75%)을 날짜 기준으로 웹 상에서 표시

예시) 11월1일은 0.75%, 11월2일은 0.75%, 11월3일은 0.8%...

2. 특정 건물을 선택할 수 있어야 한다.

예시) 초기 설정은 모든 건물을 보여주나, 셀렉트 박스로 A건물만 선택 가능

3. 날짜를 기간으로 선택할 수 있어야 한다.

예시) 초기 설정은 오늘 날짜의 달을 보여주고, 클라이언트가 2018-10-01 ~ 2018-11-26 으로 설정할 수 있습니다.

       해당 기간의 입주율을 날짜 단위로 모두 보여주고, 총 평균(56일간의 입주율 평균치)을 보여준다.

CREATE TABLE IF NOT EXISTS `mt_room_occupancy_rate` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '[ID]',
  `date` DATE NOT NULL COMMENT '[날짜]',
  `occupancy_count` INT UNSIGNED NOT NULL COMMENT '[입주방수]',
  `total_count` INT UNSIGNED NOT NULL COMMENT '[총방수]',
  `mt_property_id` INT UNSIGNED NOT NULL COMMENT '[건물ID]',
  PRIMARY KEY (`id`),
  INDEX `fk_mt_room_occupancy_rate_mt_property1_idx` (`mt_property_id` ASC),
  INDEX `fk_mt_room_occupancy_rate_mt_property2_idx` (`mt_property_id` ASC, `date` ASC),
  CONSTRAINT `fk_mt_room_occupancy_rate_mt_property1`
    FOREIGN KEY (`mt_property_id`)
    REFERENCES `mt_property` (`id`)
    ON DELETE NO ACTION
    ON UPDATE CASCADE)
ENGINE = InnoDB;

일단 이런 식으로 만들었는 데, 더 좋은 방법이나 조언이 있으시면 부탁드리겠습니다.

by 마농 [2018.11.27 15:12:53]

1. 컬럼명을 예약어로 하는 것은 좋지 않습니다.
  - (날짜, date) 로 하기 보다는.
  - (OO날짜, oo_date) 를 쓰세요.
2. PK 는
  - 무의미한 순번, id 를 쓰는것 보다는
  - 실질적인 식별자를 판별해서 사용하세요.
  - (예 : 건물, 날짜)
3. 인덱스 명이
  - fk_ 로 시작하는 것은 외래키를 의미합니다.
  - 2번 인덱스는 fk_ 가 아닌 다른 걸로 시작해야 할 듯(예 : idx_)
  - 2번 인덱스는 순서를 바꾸는 게 좋습니다.(예 : 날짜, 건물)


by 재팬종쿤 [2018.11.27 17:18:15]

답변 감사합니다!

클러스터링 인덱스를 적용하는 게 좋은 거군요.

인덱스 순서를 "날짜, 건물"로 설정할 경우, 

날짜를 기간으로 설정하면(2018-11-01 ~ 2018-11-30) 건물은 인덱스가 적용되지 않는 데

속도면에서 괜찮을까요??


by 마농 [2018.11.27 17:24:54]

(건물, 날짜) 가 PK로 설정되면 인덱스도 같이 생기는 거죠.
(날짜, 건물) 인덱스는 조건이 날짜만 들어올 경우를 대비하는 거구요.
그리고 저는 클러스터링과는 전혀 관계가 없는 답변을 드렸는데요?


by 재팬종쿤 [2018.11.27 18:36:33]

답변 감사합니다! 

두가지의 케이스를 다 대응할 수 있는거군요...

참고로, 클러스터링 인덱스는 이노디비에서 기본키에 적용되는 알고리즘입니다.

알고 계실라고 생각하지만, 건물과 날짜를 기본키로 잡으면 건물이 나열되고 날짜가 나열되는 방식이죠

그래서 무의미한 기본키인 아이디를 부여하는 것보다 클러스터링 팩터가 높아져서 퍼포먼스가 좋아지는 걸 목적으로 말씀드린겁니다.

 

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