카테고리 없음

MySQL - 튜닝(characterset)

필유아사 2024. 8. 29. 18:08

테이블이나 컬럼의 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을 설정하도록 한다.