>  기사  >  데이터 베이스  >  MySql 데이터베이스 파티셔닝 및 테이블 파티셔닝 방법에 대한 자세한 설명과 파티셔닝 및 테이블 파티셔닝 소개

MySql 데이터베이스 파티셔닝 및 테이블 파티셔닝 방법에 대한 자세한 설명과 파티셔닝 및 테이블 파티셔닝 소개

黄舟
黄舟원래의
2017-03-29 13:49:201632검색

이 글에서는 주로 MySql 데이터베이스 파티셔닝과 테이블 파티셔닝 방법을 자세하게 소개하며, 테이블 파티셔닝과 파티셔닝이 무엇인지, 그리고 mysql 테이블 파티셔닝과 파티셔닝의 연관성은 무엇인지 알려준다. 관심 있는 친구들이 참고할 수 있는 내용입니다.

1. 왜 테이블과 파티션을 나누어야 할까요?

우리는 일상적인 개발에 종종 직면합니다. 테이블의 경우, 소위 대형 테이블은 수백만, 심지어는 수천만 개의 레코드를 저장하는 테이블을 의미합니다. 이러한 테이블은 너무 커서 데이터베이스에서 쿼리 및 삽입에 너무 오랜 시간이 걸리므로 공동 쿼리가 포함되면 성능이 더욱 저하됩니다. 테이블 파티셔닝과 테이블 파티셔닝의 목적은 데이터베이스에 대한 부담을 줄이고 데이터베이스의 효율성을 높이는 것입니다. 일반적으로 테이블 추가, 삭제, 수정, 쿼리의 효율성을 높이는 것입니다.

2. 하위 테이블과 파티션이란

2.1 하위 테이블

Sub -테이블은 특정 규칙에 따라 독립적인 저장 공간을 가진 여러 엔터티 테이블로 분해됩니다. 각 테이블은 MYD 데이터 파일, .MYI 인덱스 파일, .frm 테이블 구조 파일의 세 가지 파일에 해당합니다. . 이러한 하위 테이블은 동일한 디스크나 다른 시스템에 배포될 수 있습니다. 앱이 읽고 쓸 때 미리 정의된 규칙에 따라 해당 하위 테이블 이름을 가져온 후 작동합니다.

2.2 파티션

파티셔닝은 테이블 파티셔닝과 유사하며 둘 다 규칙에 따라 테이블을 분해합니다. 차이점은 테이블 분할은 큰 테이블을 여러 개의 독립적인 엔터티 테이블로 분해하는 반면, 분할은 데이터를 세그먼트로 나누어 동일한 디스크나 다른 컴퓨터에 있을 수 있는 여러 위치에 저장한다는 것입니다. 분할 후에도 표면에는 여전히 하나의 테이블이 있지만 데이터는 여러 위치에 해시됩니다. 앱이 읽고 쓸 때 여전히 큰 테이블 이름으로 작동하며 db는 분할된 데이터를 자동으로 구성합니다.

파티셔닝의 주요 목적은 특정 SQL 작업에서 읽고 쓰는 데이터의 총량을 줄여 응답 시간을 줄이는 것입니다.

2.3 mysql 테이블과 파티션은 어떻게 연결되나요?

1) mysql의 성능을 향상시킬 수 있으며, 높은 동시성

상태에서 좋은 성능을 발휘합니다. 2) 하위 테이블과 파티션은 불일치하지 않으며 서로 협력할 수 있습니다. 액세스 볼륨이 크고 테이블 데이터가 상대적으로 큰 테이블의 경우 액세스 볼륨이 크지 않도록 하위 테이블과 파티션을 결합할 수 있습니다. 하지만 테이블 데이터가 많은 테이블의 경우 파티션을 나눌 수 있습니다.
3) 하위 테이블 기술은 더 까다롭습니다. 하위 테이블을 읽고 쓸 때 앱 서버에서 하위 테이블 이름을 계산해야 합니다. 병합을 사용하는 것이 더 좋지만 하위 테이블 간의
union 관계를 만들고 하위 테이블을 구성해야 합니다. 4) 서브 테이블에 비해 테이블 ​​파티셔닝은 조작이 간편하고 서브 테이블 생성이 필요하지 않습니다.

3. 테이블을 나누는 여러 가지 방법

3.1 mysql 클러스터

하위 테이블은 아니지만 하위 테이블과 동일한 역할을 합니다. 클러스터는 데이터베이스 작업 수를 공유하고 작업을 여러 데이터베이스에 배포할 수 있습니다. 클러스터는 읽기와 쓰기를 분리하여 읽기 및 쓰기 부담을 줄일 수 있습니다. 이를 통해 데이터베이스 성능이 향상됩니다.

3.2 사용자 정의 규칙 테이블 분할

비즈니스 규칙에 따라 큰 테이블을 여러 개의 하위 테이블로 분해할 수 있습니다. 일반적으로 다음과 같은 유형이 있으며, 자신만의 규칙을 정의할 수도 있습니다.

범위(범위) – 이 모드를 사용하면 데이터를 여러 범위로 나눌 수 있습니다. 예를 들어, 테이블은 연도별로 여러 파티션으로 나눌 수 있습니다.
Hash(해시) – 이 모드를 사용하면 테이블의 하나 이상의 열에 대한 해시 키를 계산할 수 있으며 최종적으로 이 해시 파티션을 전달합니다. 다양한 코드 값에 해당하는 데이터 영역. 예를 들어 테이블의 기본 키를 분할하는 테이블을 만들 수 있습니다.
키(키값) – 위의 해시 모드를 확장한 것으로, 여기서 해시 키는 MySQL 시스템에 의해 생성됩니다.
목록(사전 정의된 목록) – 이 모드를 사용하면 시스템이 사전 정의된 목록의 값으로 데이터를 분할할 수 있습니다.
컴포지트(컴포지트 모드) 위 모드의 조합은

하위 테이블 규칙 파티셔닝 규칙과 마찬가지로 파티셔닝 모듈에 자세히 설명되어 있습니다.


다음은 Range를 사용하여 (연도표에 따라) 표를 나누는 방법을 간략하게 소개합니다.

테이블 구조에 자동 증가 ID, 이름, 입금액, 입금 날짜의 4개 필드가 있다고 가정합니다.
입금 날짜를 사용하여 테이블을 나누고 각각 여러 개의 테이블을 생성합니다.
2011: account_2011
2012 :account_2012
...
2015: account_2015
앱에서 읽고 쓸 때 날짜를 기준으로 해당 테이블 이름을 검색하므로 수동으로 결정해야 합니다.

var getTableName = function() {
  var data = {
    name: 'tom',
    money: 2800.00,
    date: '201410013059'
  };
  var tablename = 'account_';
  var year = parseInt(data.date.substring(0, 4));
  if (year < 2012) {
    tablename += 2011; // account_2011
  } else if (year < 2013) {
    tablename += 2012; // account_2012
  } else if (year < 2014) {
    tablename += 2013; // account_2013
  } else if (year < 2015) {
    tablename += 2014; // account_2014
  } else {
    tablename += 2015; // account_2015
  }
  return tablename;
}

3.3 병합 스토리지 엔진을 사용하여 하위 테이블 구현

병합 하위 테이블은 메인 테이블과 하위 테이블로 구분됩니다. 기본 테이블은 쉘이 하위 테이블을 논리적으로 캡슐화하는 것과 유사합니다. 실제로 데이터는 하위 테이블에 저장됩니다.

하위 테이블의 규칙을 알면 하위 테이블을 직접 조작할 수도 있고, 메인 테이블을 통해 데이터를 삽입하고 쿼리할 수도 있습니다.

하위 테이블 2011

CREATE TABLE `account_2011` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;

하위 테이블 2012

CREATE TABLE `account_2012` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;

메인 테이블, 모든 연도

CREATE TABLE `account_all` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MRG_MYISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
UNION=(`account_2011`,`account_2012`)
INSERT_METHOD=LAST
ROW_FORMAT=DYNAMIC
;

메인 테이블을 생성할 때 INSERT_METHOD가 있는데, 이는 삽입 모드에서 값은 다음과 같습니다. 0은 UNION의 첫 번째 테이블에 삽입을 허용하지 않습니다. LAST는 UNION의 마지막 테이블에 삽입합니다.

메인 테이블을 통해 쿼리하는 것은 모든 하위 테이블을 함께 쿼리하는 것과 같습니다. 이는 하위 테이블의 장점을 반영하지 않습니다. 하위 테이블을 쿼리하는 것이 좋습니다.

4. 여러 가지 분할 방법

4.1 범위

create table range( 
  id int(11), 
  money int(11) unsigned not null, 
  date datetime 
  )partition by range(year(date))( 
  partition p2007 values less than (2008), 
  partition p2008 values less than (2009), 
  partition p2009 values less than (2010) 
  partition p2010 values less than maxvalue 
);

4.2 목록

create table list( 
  a int(11), 
  b int(11) 
  )(partition by list (b) 
  partition p0 values in (1,3,5,7,9), 
  partition p1 values in (2,4,6,8,0) 
 );

4.3 해시

create table hash( 
  a int(11), 
  b datetime 
  )partition by hash (YEAR(b) 
  partitions 4;

4.4 키

create table t_key( 
  a int(11), 
  b datetime) 
  partition by key (b) 
  partitions 4;

4.5 파티션 관리

4.5.1 새 파티션 추가

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));

4.5.2 파티션 삭제

파티션이 삭제되면 해당 파티션의 모든 데이터도 삭제됩니다.

ALTER TABLE sale_data DROP PARTITION p201010;

4.5.3 파티션 병합

다음 SQL은 p201001 - p201009를 3개의 파티션 p2010Q1 - p2010Q3

ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);
로 병합합니다.

위 내용은 MySql 데이터베이스 파티셔닝 및 테이블 파티셔닝 방법에 대한 자세한 설명과 파티셔닝 및 테이블 파티셔닝 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.