create table login_history (
idx BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT ,
user_id varchar(50) not null default '',
user_type varchar(10) not null,
regDate datetime not null,
loginDate datetime not null,
devKey char(1) not null default '0',
primary key (idx)
index `devKey_userType_regDate` (`devKey`, `user_type`, `regDate`),
index `devKey_userType_loginDate` (`devKey`, `user_type`, `loginDate`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
테이블 구성은 이렇게 되어있습니다. 데이터는 약 6,000,000건 정도 있습니다.
user_type 컬럼에는 A ~ D 의 4가지 값이 전체 데이터의 4분의 1 정도씩 균일하게 들어가 있습니다. (type 당 이백만건정도씩)
devKey 컬럼에는 0 값은 전체데이터의 99% 정도 들어있고, 1 값이 1% 정도 들어 있습니다.
user_id 는 중복된 값이 들어갈수 있으므로 유니크한 카운트를 구하려면 distinct 를 해야합니다.
주로 조회 하는 쿼리는 아래와 같습니다.
1. select count(distinct(user_id)) from login_history where devKey = 0 and user_type = 'A' and regDate between '2017-02-01 00:00:00' and '2017-02-22 23:59:59'
2. select count(distinct(user_id)) from login_history where devKey = 0 and user_type = 'B' and loginDate between '2017-02-01 00:00:00' and '2017-02-22 23:59:59'
3. select count(distinct(user_id)) from login_history where devKey = 0 and regDate <= '2017-02-22 23:59:59'
1번을 조회하면 devKey_userType_regDate 인덱스가 설정되어 적절한 속도가 나오는데요
2번을 조회하면 devKey_userType_regDate 와 devKey_userType_loginDate 가 같이 적용 되는군요..
위와 같이 3개의 쿼리를 사용하고, 테이블 스키마가 위와 같다면 어떻게 인덱스를 설정하는게 좋은지 조언 구합니다.
|