MySQL 의 중복 색인 과 중복 색인 의 차이 점 설명

MySQL 은 한 열 에 여러 개의 색인 을 만 들 수 있 습 니 다.의도 적 이 든 무의식 적 이 든 MySQL 은 이러한 중복 색인 을 따로 유지 해 야 합 니 다.최적화 기 는 조 회 를 최적화 할 때 도 하나씩 고려 해 야 합 니 다.이것 은 MySQL 의 성능 에 영향 을 줄 수 있 습 니 다.
개념 논술
반복 색인:같은 열 에 같은 순서 로 같은 종류의 색인 을 만 듭 니 다.이러한 중복 색인 을 만 드 는 것 을 피해 야 하 며,발견 한 후에 도 즉시 제거 해 야 한다.
중복 색인:두 색인 은 같은 순서 로 같은 열 을 덮어 씁 니 다.
생 성 된 이유
일반적으로 우 리 는 가끔 부주의 로 중복 색인 을 만 들 기도 한다.예 를 들 어 다음 과 같은 예 이다.

CREATE TABLE test(
 ID INT NOT NULL PRIMARY KEY,
 A INT NOT NULL,
 B INT NOT NULL,
 UNIQUE(ID),
 INDEX(ID)
)ENGINE=InnoDB;
MySQL 의 유일한 제한 과 메 인 키 제한 은 색인 을 통 해 이 루어 지기 때문에 사실상 위 코드 로 만 든 표를 사용 하면 실제 ID 열 에 3 개의 색인 을 만 듭 니 다.같은 열 에서 서로 다른 조회 수 요 를 만족 시 키 기 위해 서로 다른 유형의 색인 을 만 들 지 않 는 한 그 럴 이유 가 없다.예 를 들 어 KEY(col)와 FULLTEXT KEY(col)두 가지 색인 이다.
중복 색인 과 중복 색인 은 약간 다르다.색인(A,B)을 만 들 었 다 면 색인(A)을 만 드 는 것 은 이전 색인 의 접두사 색인 이기 때 문 입 니 다.그러나 색인(B,A)을 만 들 었 다 면 불필요 한 색인 이 아니 라 색인(B)도 불필요 한 색인 이 아 닙 니 다.색인(A,B)의 가장 왼쪽 접두사 열 이 아니 기 때 문 입 니 다.그 밖 에 서로 다른 유형의 색인 도 B 트 리 색인 의 불필요 한 색인 이 아 닙 니 다.덮어 쓰 는 색인 열 이 무엇 이 든 간 에.
대부분의 경우 불필요 한 색인 을 사용 할 필요 가 없 으 며,가능 한 한 새로운 색인 을 만 드 는 것 이 아니 라 기 존의 색인 을 확대 해 야 한다.그러나 가끔 은 성능 을 고려 하여 기 존의 색인 을 확대 하면 너무 커 져 서 이 색인 을 사용 하 는 다른 조회 의 성능 에 영향 을 줄 수 있다.
영향.
중복 색인 을 덮어 쓰기 색인 으로 만 들 면 일부 검색 에 대한 QPS 를 높 일 수 있 지만 두 개의 색인 도 단점 이 있 습 니 다.즉,색인 비용 이 더 높다 는 것 입 니 다.
표 의 색인 이 점점 많아 지면 표 의 삽입 속도 가 느 려 집 니 다.일반적으로 새로운 색인 을 추가 하면 INSERT,UPDATE,DELETE 등 작업 속도 가 느 려 집 니 다.특히 색인 을 추가 한 후에 메모리 의 병목 에 이 르 렀 을 때.
불필요 한 색인 과 중복 색인 을 해결 하 는 방법 은 간단 하 다.이 색인 을 삭제 하면 되 지만 먼저 해 야 할 일 은 이런 색인 을 찾 는 것 이다.
추가:MySQL 에서 중복 색인 과 중복 외부 키 정리
MySQL 은 같은 열 에 중복 되 는 색인 을 만 들 수 있 지만,이렇게 하면 데이터베이스 에 해 롭 고 이익 이 없 으 므 로,이러한 중복 색인 을 정기 적 으로 검사 하여 데이터베이스 성능 을 개선 해 야 합 니 다.
디스크 공간 점용 을 줄 이 고 디스크 IO 를 줄 이 며 최적화 기 를 줄 여 조회 할 때 비교 해 야 할 색인 개 수 를 줄 이 고 데이터 베 이 스 를 유지 하 는 중복 색인 의 각종 비용 을 줄 이 며 데이터 베이스 성능(삽입,업데이트,삭제)을 향상 시 킬 수 있 습 니 다.
반복 인덱스 검사
pt-duplicate-key-checker:SHOW CREATE TABLE 출력 표 정 의 를 통 해 MySQL 표 에서 중복 되 거나 불필요 한 색인 이나 외 키 를 감지 합 니 다.
감지 할 수 있 는 중복/중복 색인 형식:만약 에 특정한 색인 과 다른 색인 이 같은 순서 로 같은 열 을 포함 하거나 이 색인 에 포 함 된 열 이 다른 색인 의 가장 왼쪽 접두사 열 이 라면 중복/중복 색인 으로 여 겨 집 니 다.
기본 적 인 상황 에서 같은 유형의 색인 간(예 를 들 어 BTREE 색인)만 비교 하고 서로 다른 유형의 색인 은 상기 설명 에 부합 되 더 라 도 중복/중복 으로 간주 되 지 않 지만 이 행 위 는 매개 변 수 를 통 해 변경 할 수 있 습 니 다.
이외에 도 중 복 된 외 키,즉 인 용 된 표 와 열 이 같은 외 키 를 검출 할 수 있다.클 러 스 터 색인 표 에 대해 서 는 보조 색인 뒤에 메 인 키 열 을 추가 하 는 색인 도 지루 하 다 고 여 겨 집 니 다.이 경우 보조 색인 끝 자체 에 메 인 키 정보 가 포함 되 어 있 기 때 문 입 니 다.
기본 용법 및 샘플 출력 은 다음 과 같다.

[root@VM_8_180_centos packages]# pt-duplicate-key-checker A=utf8, F=/etc/my.cnf, h=localhost, u=root, P=3306 Cask-pass
샘플 출력:

# ########################################################################
# dcf.privilege                              
# ########################################################################
# Uniqueness of UQI_IDX_1 ignored because PRIMARY is a duplicate constraint
# UQI_IDX_1 is a duplicate of PRIMARY
# Key definitions:
#  UNIQUE KEY `UQI_IDX_1` (`privilege_id`),
#  PRIMARY KEY (`privilege_id`),
# Column types:
#   `privilege_id` varchar(50) collate utf8_bin not null comment '  id'
# To remove this duplicate index, execute:
ALTER TABLE `dcf`.`privilege` DROP INDEX `UQI_IDX_1`;
# ########################################################################
# dcf.t_game_config                            
# ########################################################################
# Uniqueness of pkey ignored because PRIMARY is a duplicate constraint
# pkey is a duplicate of PRIMARY
# Key definitions:
#  UNIQUE KEY `pkey` (`pkey`)
#  PRIMARY KEY (`pkey`),
# Column types:
#   `pkey` bigint(20) not null auto_increment
# To remove this duplicate index, execute:
ALTER TABLE `dcf`.`t_game_config` DROP INDEX `pkey`;
# ########################################################################
# dcf.t_project_institution                        
# ########################################################################
# index_1 is a left-prefix of index_2
# Key definitions:
#  KEY `index_1` (`project_id`),
#  KEY `index_2` (`project_id`,`institution_id`,`delete_flag`)
# Column types:
#   `project_id` bigint(20) not null comment '  id'
#   `institution_id` varchar(20) not null comment '  id'
#   `delete_flag` tinyint(4) not null
# To remove this duplicate index, execute:
ALTER TABLE `dcf`.`t_project_institution` DROP INDEX `index_1`;
# ########################################################################
# dcf_commons.bank_cnaps                         
# ########################################################################
# idx is a duplicate of PRIMARY
# Key definitions:
#  KEY `idx` (`cnaps`)
#  PRIMARY KEY (`cnaps`),
# Column types:
#   `cnaps` varchar(255) not null comment '     '
# To remove this duplicate index, execute:
ALTER TABLE `dcf_commons`.`bank_cnaps` DROP INDEX `idx`;
# ########################################################################
# dcf_contract.customer_bank_account                   
# ########################################################################
# IDX_CUSTOMER_ID is a left-prefix of UQI_IDX_1
# Key definitions:
#  KEY `IDX_CUSTOMER_ID` (`customer_id`)
#  UNIQUE KEY `UQI_IDX_1` (`customer_id`,`account_no`,`branch_bank`,`account_type`,`account_name`) USING BTREE,
# Column types:
#   `customer_id` varchar(20) collate utf8_bin not null comment '  id'
#   `account_no` varchar(40) collate utf8_bin default null comment '    '
#   `branch_bank` varchar(100) collate utf8_bin default null comment '    '
#   `account_type` tinyint(4) default null comment '    :      ,     
0-
1- ' # `account_name` varchar(100) collate utf8_bin default null comment ' ' # To remove this duplicate index, execute: ALTER TABLE `dcf_contract`.`customer_bank_account` DROP INDEX `IDX_CUSTOMER_ID`; # ######################################################################## # dcf_contract.t_contract_account # ######################################################################## # IDX_CONTRACT_ID is a left-prefix of t_contract_account_uq1 # Key definitions: # KEY `IDX_CONTRACT_ID` (`contract_id`) # UNIQUE KEY `t_contract_account_uq1` (`contract_id`,`account_type`), # Column types: # `contract_id` bigint(20) not null comment ' id' # `account_type` tinyint(4) not null comment ' :globalconstant.bankaccounttypec
0-
1- ' # To remove this duplicate index, execute: ALTER TABLE `dcf_contract`.`t_contract_account` DROP INDEX `IDX_CONTRACT_ID`; ...... ...... # ######################################################################## # Summary of indexes # ######################################################################## # Size Duplicate Indexes 173317386 # Total Duplicate Indexes 18 # Total Indexes 562
중복/중복 형식,색인/외 키 정의,색인 에 포 함 된 열 형식,중복/중복 색인/외 키 를 제거 하 는 SQL,마지막 으로 색인 에 대한 통계 정 보 를 제공 합 니 다.
반복 인덱스 삭제
도구 출력 결과 의 ALTER TABLE 문 구 를 직접 실행 하면 되 지만 실행 전에 발생 할 수 있 는 영향 을 자세히 평가 해 야 합 니 다.예 를 들 어 표 가 매우 큰 경우 주종 복사 지연 을 초래 할 수 있 습 니 다.예 를 들 어 SQL 에 색인 알림 이 포함 되 어 있 으 면 색인 을 직접 삭제 하면 SQL 문법 오류 가 발생 할 수 있 습 니 다.이러한 SQL 이 포함 되 어 있 는 지 미리 확인 하 는 것 이 좋 습 니 다.(genel log 또는 tcpdump 도 구 를 통 해 SQL 을 얻 고 분석 할 수 있 습 니 다)
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.만약 잘못 이 있 거나 완전히 고려 하지 않 은 부분 이 있다 면 아낌없이 가르침 을 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기