>데이터 베이스 >MySQL 튜토리얼 >MySQL 파티션 필드 열에 대해 별도의 인덱스를 생성해야 합니까?

MySQL 파티션 필드 열에 대해 별도의 인덱스를 생성해야 합니까?

小云云
小云云원래의
2017-12-08 10:55:252414검색

파티션 필드가 기본 키의 일부여야 한다는 것은 누구나 알고 있습니다. 그러면 복합 기본 키를 생성한 후 파티션 필드에 별도의 인덱스를 추가해야 합니까? 효과적인가요? 이 글은 MySQL 파티션 필드 컬럼에 대한 별도의 인덱스 구축이 필요한지 여부에 대한 관련 정보를 주로 소개합니다. 이 글은 예제를 통해 검증되었으며, 이를 필요로 하는 모든 사람들의 이해와 학습을 위한 확실한 참고 학습 가치를 담고 있습니다. 소규모로 함께 배워봅시다.

1. 새로운 테이블을 만듭니다.(생성 시간을 기준으로 월별로 분할)


CREATE TABLE `effect_new` (
 `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `type` tinyint(4) NOT NULL DEFAULT '0',
 `timezone` varchar(10) DEFAULT NULL,
 `date` varchar(10) NOT NULL,
 `hour` varchar(2) DEFAULT NULL,
 `position` varchar(200) DEFAULT NULL,
 `country` varchar(32) NOT NULL,
 `create_time` datetime NOT NULL DEFAULT '1970-01-01 00:00:00',
 PRIMARY KEY (`id`,`create_time`),
 KEY `index_date_hour_coun` (`date`,`hour`,`country`)
) ENGINE=InnoDB AUTO_INCREMENT=983041 DEFAULT CHARSET=utf8
PARTITION BY RANGE (TO_DAYS (`create_time`))
(PARTITION p0 VALUES LESS THAN (736754) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (736785) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (736815) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (736846) ENGINE = InnoDB,
 PARTITION p4 VALUES LESS THAN (736876) ENGINE = InnoDB,
 PARTITION p5 VALUES LESS THAN (736907) ENGINE = InnoDB,
 PARTITION p6 VALUES LESS THAN (736938) ENGINE = InnoDB,
 PARTITION p7 VALUES LESS THAN (736968) ENGINE = InnoDB,
 PARTITION p8 VALUES LESS THAN (736999) ENGINE = InnoDB,
 PARTITION p9 VALUES LESS THAN (737029) ENGINE = InnoDB,
 PARTITION p10 VALUES LESS THAN (737060) ENGINE = InnoDB);


2.


INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('1', '0', 'GMT+8', '2017-07-01', '', 'M-NotiCleanFull-FamilyRecom-0026', '', '2017-07-02 00:07:02');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('2', '1', 'GMT+8', '2017-09-30', '23', 'Ma5dtJub', 'EG', '2017-10-01 00:00:00');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('3', '1', 'GMT+8', '2017-09-10', '10', '28', 'DZ', '2017-09-11 00:08:20');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('4', '1', 'GMT+8', '2017-02-03', '20', '32', 'AD', '2017-02-04 00:00:00');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('5', '0', 'GMT+8', '2017-03-05', '2', NULL, 'AI', '2017-03-06 02:10:00');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('6', '0', 'GMT+8', '2017-09-23', '13', 'M-BrandSplash-S-0038', 'AG', '2017-09-23 13:00:00');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('7', '1', NULL, '2017-10-13', '12', 'BB-Main-AppAd-0018', 'AF', '2017-10-14 12:00:00');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('8', '0', 'GMT+8', '2017-10-28', '2', 'M-ChargeReminder-S-0040', 'AE', '2017-10-29 00:00:00');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('9', '1', 'GMT+8', '2017-10-09', NULL, '30', 'AI', '2017-10-10 00:09:00');
INSERT INTO `effect_new` (`id`, `type`, `timezone`, `date`, `hour`, `position`, `country`, `create_time`) VALUES ('10', '0', 'GMT+8', '2017-10-05', '5', ' M-BrandSplash', 'LA', '2017-10-06 05:10:00');


결과는 다음과 같습니다.



id

select_type


table

partitionstpye가능 _keyskeykey_lenrefrows filtered extra1SIMPLE effect_newp8ALLnullnullnullnull391515 10 where 사용을 추가합니다. 5. 인덱스 추가 후 실행 계획을 분석합니다. 결과는
4. effect_new 인덱스 idx_ctime



id

select_type


table

partitions입니다. tpye possible_keys key key_lenrefrowsfilteredextra1SIMPLE effect_newp8refidx_ctime id x_ctime5const60760100 null이 필드를 기준으로 테이블을 분할했지만 인덱스와 동일시할 수는 없습니다. 파티셔닝 후에는 필드에 특정 값을 가진 레코드가 특정 파티션에 포함될 것이라고 할 수 있지만 인덱스가 아니므로 찾기가 어렵습니다. 때로는 기본 키가 분할 기준 열과 동일하지 않을 때가 있습니다. 이때 기본 키가 클러스터형 인덱스를 구성하려면 분할 기준 열을 포함하여 복합 기본 키로 만들어야 합니다. 그렇다면 이 경우 파티셔닝 컬럼에는 인덱스가 없는 걸까요? 예, 하지만 충분히 빠르지 않습니다. 이 복합 인덱스에서 분할 기준 열이 첫 번째 순위가 아니면 충분히 빠르지 않습니다. 분할 기준 열이 검색문에서 필터 조건으로 자주 사용되는 경우에는 필요합니다. 분할 기준 열에 추가 열을 추가하려면 별도의 인덱스를 만듭니다. 관련 권장 사항:
6. 결론:


MYSQL의 파티션 필드는 기본 키 필드에 포함되어야 합니다_MySQL

다양한 MySQL 스토리지 엔진과 다양한 파티션 필드가 쿼리에 미치는 영향_MySQL

MySQL 파티션 테이블 파티션 온라인 수정 파티션 필드_MySQL

위 내용은 MySQL 파티션 필드 열에 대해 별도의 인덱스를 생성해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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