====== MySQL Partition ======
* [[database:mysql|MySQL]] Partitioning
* [[https://dev.mysql.com/doc/refman/5.7/en/partitioning.html|MySQL 5.7 Partitioning]]
* [[https://12bme.tistory.com/48|[MySQL] MySQL 파티션 개요]]
===== 단점 / 제약 =====
* [[https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations.html|MySQL :: MySQL 5.7 Reference Manual :: 22.6 Restrictions and Limitations on Partitioning]]
* 한 테이블 파티션의 최대 개수는 8192 개이다(NDB 제외).
* 파티션 갯수가 많아지면 open files 도 커져야 한다. [[linux:performance|Linux Performance]]
* 모든 파티션은 동일한 스토리지 엔진 사용 : 파티션별 다른 엔진을 지정하여도 에러가 발생하지는 않지만 적용되는것은 아니다.
* 테이블과 인덱스를 별도로 파티션 할수는 없다. 테이블과 인덱스를 같이 Partitioning 하여야 한다.
* Partition 된 테이블은 foreign Key를 지원하지 않는다.
* Partition 된 테이블은 FullText Index 를 지원하지 않는다.
* Partition 된 테이블은 Geometry(point, geometry...) 컬럼 타입을 지원하지 않는다.
* Temp Table 은 파티션 사용 불가.
* Partition 값은 정수형이어야 한다.
* 테이블이 Unique 또는 Primary Key를 가지고 있다면, 파티션키는 모든 Unique 또는 Primary Key의 일부 또는 모든 컬럼을 포함해야 한다.
* 파티션 키의 표현식은 일반적으로 컬럼 그 자체 또는 MySQL 내장 함수를 사용할 수 있는데, 여기서 MySQL 내장 함수를 모두 사용할 수 있는 것이 아니라 일부만 사용할 수 있습니다. (자세한 함수 목록은 현재 사용중인 MySQL 버전의 매뉴얼을 참고합니다.) 하지만 이 함수 중에서도 정상적으로 파티션 프루닝(Pruning)을 지원하는 함수는 YEAR()와 TO_DAYS(), TO_SECONDS()밖에 없으므로 제대로 파티션의 기능을 이용하려고 한다면 INTEGER 타입의 컬럼 그 자체 또는 이 3가지 내장 함수를 사용한 표현식을 파티션 키로 사용할 것을 권장합니다. (TO_SECONDS 함수는 MySQL 5.5부터 지원됩니다.)
===== Partition 관련 명령 =====
* [[https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html|MySQL :: MySQL 5.7 Reference Manual :: 13.1.8.1 ALTER TABLE Partition Operations]]
==== DROP PARTITION ====
* 파티션 자체를 삭제한다. 데이터도 함께.
ALTER TABLE t1 DROP PARTITION p0, p1;
* 파티션의 데이터를 비운다. 파티션 자체는 계속 존재한다.
CREATE TABLE t1 (
id INT,
year_col INT
)
PARTITION BY RANGE (year_col) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1995),
PARTITION p2 VALUES LESS THAN (1999),
PARTITION p3 VALUES LESS THAN (2003),
PARTITION p4 VALUES LESS THAN (2007)
);
ALTER TABLE t1 TRUNCATE PARTITION p0;
-- 아래와 동일
DELETE FROM t1 WHERE year_col < 1991;
-- 복수개 삭제
ALTER TABLE t1 TRUNCATE PARTITION p1, p3;
-- 진짜로 해당 파티션 데이터가 삭제 됐는지 확인
SELECT PARTITION_NAME, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 't1';
===== 참조 =====
* [[https://bistros.tistory.com/entry/Mysql-partition-%EC%82%AC%EC%9A%A9%EC%9D%B4%EC%9C%A0%EC%A0%9C%ED%95%9C%EC%A3%BC%EC%9D%98%EC%82%AC%ED%95%AD%EB%93%B1|b :: Mysql partition 사용이유,제한,주의사항등...]]
* [[https://12bme.tistory.com/52?category=682920|[MySQL] MySQL 파티션 제약사항]]
* [[http://tnsdogfoot.blogspot.com/2014/09/2014-9-25.html|잡다한 부스러기: MySQL Patitioning 적용 방법과 장단점]]
* [[http://gywn.net/2019/08/mysql-poor-performance-with-super-many-partitions/|MySQL 파티셔닝 테이블 SELECT가 느려요. | gywndi's database]]