MySQL 문자열 인덱스 보다 합 리 적 인 생 성 규칙 에 대한 토론

5449 단어 mysql인덱스규칙.
머리말
MySQL 을 사용 하 는 색인 에 대해 서 는 색인 의 가장 왼쪽 접두사 규칙,색인 덮어 쓰기,유일한 색인 과 일반 색인 사용,최적화 기 선택 색인 등 개념 을 소개 한 적 이 있 습 니 다.오늘 우 리 는 문자열 에 색인 을 만 드 는 방법 에 대해 토론 합 니 다.
문자열 인덱스 를 만 드 는 방법
MySQL 에서 데이터 와 색인 은 모두 B+트 리 에 있 습 니 다.색인 을 만 들 때 이 트 리 가 차지 하 는 공간 이 작 을 수록 검색 속도 가 빨 라 집 니 다.varchar 형식의 문자열 이 길 어 집 니 다.효율 적 인 오늘날 문자열 의 색인 을 어떻게 합 리 적 으로 만 듭 니까?
만약 우리 표 에 email 필드 가 존재 한다 면,지금 email 필드 에 색인 을 만 들 려 고 합 니 다.email 필드 값 의 형식 은:[email protected]
색인 을 만 드 는 방법 은 두 가지 가 있 습 니 다.
1.이메일 필드 에 직접 색인 만 들 기:alter table t add index index1(email);색인 트 리 구조:

2.email 의 접두사 색인 만 들 기:alter table t add index index2(email(6));색인 데이터 구조:

이때 우리 의 검색 어 는 다음 과 같다.select id,name,email from t where email='[email protected]';index 1 색인 을 사용 할 때 실행 절 차 는 다음 과 같 습 니 다.
1.index 1 색인 트 리 에서 색인 값 을 찾 습 니 다[email protected]의 주 키 값 ID1;
2.ID 1 회 표 에서 이 줄 의 데 이 터 를 확인 한 결과[email protected]결 과 를 결과 집합 에 추가 합 니 다.
3.index 1 색인 트 리 의 다음 색인 값 이 만족 하 는 지 계속 찾 습 니 다[email protected]만족 하지 않 으 면 조 회 를 끝 냅 니 다.
index 2 색인 을 사용 할 때 실행 절 차 는 다음 과 같 습 니 다.
1.index 2 색인 트 리 에서 색인 값 이 zhangs 인 주 키 값 ID1 을 찾 습 니 다.
2.ID 1 회 표 에서 이 줄 의 데 이 터 를 확인 한 결과[email protected]결 과 를 결과 집합 에 추가 합 니 다.
3.index 2 색인 트 리 의 다음 색인 값 이 zhangs 에 만족 하 는 지 계속 찾 고 만족 하면 이 줄 의 데 이 터 를 계속 조회 합 니 다[email protected]아 닙 니 다.건 너 뛰 고 계속 찾 습 니 다.
4.색인 값 이 zhangs 가 아 닐 때 까지 index 2 색인 트 리 를 계속 찾 습 니 다.
상기 분석 에서 알 수 있 듯 이 전체 필드 색인 은 접두사 색인 에 비해 리 턴 횟수 를 줄 였 지만 접 두 사 를 6 개 에서 7 개 8 개 로 늘 리 면 접두사 색인 리 턴 횟수 가 줄어든다.즉,접두사 의 길 이 를 잘 정의 하면 공간 도 절약 하고 효율 도 확보 할 수 있다 는 것 이다.
그렇다면 문 제 는 접두사 색인 을 사용 하 는 길 이 를 어떻게 재 느 냐 는 것 이다.
1.사용select count(distinct email) as L from t; 으로 필드 의 서로 다른 값 의 개 수 를 조회 합 니 다.
2.서로 다른 접두사 길 이 를 순서대로 선택 하여 서로 다른 값 의 개 수 를 봅 니 다.

select
 count(distinct left(email,4))as L4,
 count(distinct left(email,5))as L5,
 count(distinct left(email,6))as L6,
 count(distinct left(email,7))as L7,
from t;
그리고 실제 받 아들 일 수 있 는 손실 비율 에 따라 가장 짧 은 접두사 길 이 를 선택한다.
접두사 의 길이 문 제 는 우리 가 해결 하 였 으 나,문 제 는 접두사 색인 을 사용 하면 우리 색인 이 덮어 쓰 는 특성 을 사용 할 수 없다 는 것 이다.
전체 필드 인덱스 를 사용 할 때,우리 가 조회select id,email from t where email='[email protected]';할 때,리 턴 하지 않 아 도 id 와 email 필드 를 직접 찾 을 수 있 습 니 다.
그러나 접두사 색인 을 사용 할 때 MySQL 은 접두사 가 이메일 의 값 전 체 를 덮어 쓸 지 여 부 를 잘 모 르 고 모든 포함 여부 와 상 관 없 이 홈 키 값 에 따라 표 조회 하여 판단 합 니 다.
따라서 접두사 색인 을 사용 하면 공간 을 절약 하고 효율 을 보장 할 수 있 지만 색인 을 덮어 쓰 는 특성 을 사용 할 수 없 기 때문에 사용 여 부 는 구체 적 으로 고려 한 것 이다.
다른 문자열 인덱스 생 성 방식
실제 상황 을 고려 하면 모든 문자열 이 접 두 사 를 사용 하여 색인 을 만 들 수 있 는 것 이 아 닙 니 다.예 를 들 어 신분증 번호 나 ip 등 문자열 은 접두사 색인 을 사용 하 는 것 이 합 리 적 이지 않 습 니 다.신분증 번 호 는 보통 같은 지역 의 사람들 앞 자리 가 똑 같 고 접두사 색인 을 사용 하면 합 리 적 이지 않 습 니 다.ip 값 은 실제 적 으로 숫자 로 바 꾸 어 저장 합 니 다.
신분증 번호 에 대해 서 는 거꾸로 저장 소 를 사용 하여 접 두 사 를 찾 아 색인 을 만 들 거나 crc 32()함수 로 hash 검사 코드(int 값)를 색인 으로 가 져 올 수 있 습 니 다.
서술:select field_list from t where id_card = reverse('input_id_card_string');crc32: select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string'이 두 가지 방식 은 상대 적 으로 효율 이 떨 어 지지 않 고 범위 검색 을 지원 하지 않 으 며 등가 검색 을 지원 합 니 다.
역 서 방식 에 서 는 reverse 함 수 를 사용 해 야 하지만,회 표 횟수 는 hash 방식 보다 많 을 수 있 습 니 다.
hash 방식 에 서 는 색인 필드 를 새로 만 들 고 crc 32()함 수 를 호출 해 야 합 니 다.(주의:crc 32()함수 가 얻 은 결 과 는 유일한 것 을 보장 하지 않 습 니 다.중복 되 는 상황 이 있 을 수 있 지만 이 경우 확률 이 적 습 니 다).회 표 횟수 가 적 고 거의 한 번 이면 됩 니 다.
마지막.
문자열 인덱스 에 대해 다음 과 같은 몇 가지 생 성 방식 이 있 습 니 다.
1.문자열 이 짧 고 전체 필드 색인
2.문자열 이 길 고 접두사 의 구분 이 좋 으 며 접두사 색인 을 만 듭 니 다.
3.문자열 이 길 고 접두사 의 구분 이 좋 지 않 습 니 다.거꾸로 서술 하거나 hash 방식 으로 색인 을 만 듭 니 다.(이런 방식 으로 범위 조회 가 안 됩 니 다)
4.실제 상황 에 따라 ip 와 같은 특수 문자열 을 만 납 니 다.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기