테이블이나 컬럼의 character set 이 상이한 경우 인덱스가 존재하더라도, Full Table Scan으로 수행될 수 있다.
1) character set이 다른 2개의 테이블 생성
country와 city라는 2개의 테이블을 생성한다. city의 CountryCode는 country 테이블의 Code값을 가지고 있다.
CREATE TABLE `country` (
`Code` char(3) NOT NULL DEFAULT '',
`Name` char(52) NOT NULL DEFAULT '',
`Continent` enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
`Region` char(26) NOT NULL DEFAULT '',
PRIMARY KEY (`Code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;
CREATE TABLE `city` (
`ID` int NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
2) JOIN
country와 city 테이블을 JOIN하여 조회한다.
select *
from country a, city b
where a.code = b.CountryCode
and a.code = 'AFG';
3) 실행계획 보기
MySQL Workbench 로 실행계획을 확인한다.
character set이 상이한 테이블을 join한 결과 인덱스가 존재함에도 Full Table Scan 하는 것을 볼 수 있다.
4) character set 변경
city 테이블의 character set을 country 테이블의 character set과 동일하게 변경한다.
alter table city convert to character set utf8mb4;
5) 실행계획 확인
MySQL Workbench 로 실행계획을 확인한다.
정상적으로 인덱스 Scan을 확인할 수 있다.
6) 결론
Character Set이 상이한 경우에 정상적으로 인덱스를 타지 않을 수 있으므로, 특별한 경우가 아니라면 동일한 character set을 설정하도록 한다.