소용량의 데이터를 다룰 때는 테이블이 저장되는 물리적 공간인 '테이블스페이스 Tablespace'에 대해서 별로 신경쓰지 않아도 되지만, 대용량의 데이터를 다룰 때는 성능 향상을 위해서 테이블스페이스에 대한 설정을 하는 것이 좋다.

데이터베이스가 테이블이 저장되는 논리적 공간이라면, 테이블스페이스는 테이블이 실제로 저장되는 물리적인 공간을 말한다. 지금까지는 테이블을 생성할 때 별도의 테이블스페이스를 지정하지 않았기 때문에 시스템 테이블스페이스 System Tablespace에 테이블이 저장되었다. 시스템 테이블스페이스에 대한 정보는 시스템 변수 innodb_data_file_path에 관련 내용이 저장되어 있다.
SHOW VARIABLES LIKE 'innodb_file_per_table';

Value가 기본값으로 ON이어야 한다.
SHOW VARIABLES LIKE 'innodb_data_file_path';

시스템 변수 확인
값의 정보는 '파일명:파일크기:최대파일크기'를 의미하는데, 기본적으로 파일은 ibdata1이고, 파일크기는 12MB, 최대 파일 크기는 허용하는 최대값까지 자동 증가한다. MySQL 8.0에서 테이블스페이스 파일은 기본적으로 'C:\Programdata\MySQL\MySQL Server 8.0\Data'폴더에 저장되어 있다. 이 파일은 숨긴 파일이라서 숨긴 항목에 체크해서 봐야한다.
기본 설정은 모든 테이블이 시스템 테이블스페이스에 저장되지만, 대용량 테이블을 동시에 여러 개 사용하는 상황이라면 테이블마다 별도의 테이블스페이스에 저장하는 것이 성능에 효과적이다. 다음과 같이 각 테이블스페이스마다 별도의 대용량 테이블을 저장하는 상황을 가정해 보자.

테이블스페이스가 분리된 테이블
<실습>
대용량의 데이터를 운영한다는 가정하에, 테이블스페이스를 분리해서 사용해 보자.
먼저 각 테이블이 별도의 테이블스페이스에 저장되도록 시스템 변수 innodb_file_per_table이 ON으로 설정되어 있어야 한다. MySQL 8.0은 기본적으로 ON으로 설정되어 있다.
SHOW VARIABLES LIKE 'innodb_file_per_table';


CREATE TABLESPACE ts_a ADD DATAFILE 'ts_a.ibd';
CREATE TABLESPACE ts_b ADD DATAFILE 'ts_b.ibd';
CREATE TABLESPACE ts_c ADD DATAFILE 'ts_c.ibd';
USE sqldb;
CREATE TABLE table_a (id INT) TABLESPACE ts_a;
CREATE TABLE table_b (id INT);
ALTER TABLE table_b TABLESPACE ts_b;
CREATE TABLE table_c (SELECT * FROM employees.salaries);
ALTER TABLE table_c TABLESPACE ts_c;
쿼리가 너무 오래걸리면 오류를 발생시키고 끊어버림.
Edit -> Preferences -> 왼쪽에 SQL Editor -> 밑에 MySQL Session 부분 -> 무제한으로 하고싶으면 0으로 고치면 됨.
만든 테이블스페이스들을 물리적으로 확인해보자.
'C:\Programdata\MySQL\MySQL Server 8.0\Data'로 이동

잘 생성된 것을 확인할 수 있다.