당신 의 like 문 구 는 왜 색인 에 대한 상세 한 설명 이 없 습 니까?

6751 단어 like문장인덱스
머리말
본 고 는 가장 통속 적 인 언어 로 가장 무미건조 한 기본 지식 을 이야기 하 는 데 목적 을 두 고 있다.
이 화 제 는 비교적 재미있다.어제 점심 을 먹고 나 서 갑자기 한 동료 가 튀 어 나 왔 다."like 색인 있어 요?"나 는 입 에서 나 오 는 대로 없다 고 말 했다.다른 동 료 는 있다 고 반박 했다.또 어떤 동 료 는 상황 을 보 니 있다 고 말 했다.이 제 는 좀 어 리 석 었 다.그런 말 이 정확 한 지 몰 랐 다.그래서 이 문 제 를 연구 하고 검증 하 는 데 시간 반 이 걸 려 서 마침내 답 을 얻 었 다.
어떻게 검 증 했 죠?
MySQL 의 성능 최적화 에는 explain 이라는 신기 가 있 는데 selection 문 구 를 분석 하고 상세 한 select 실행 과정의 상세 한 정 보 를 출력 하여 개발 자 들 이 이러한 정보 에서 최적화 된 방향 을 얻 을 수 있다 는 소문 이 있다.
다음은 이 MySQL 이 제공 하 는 explain 명령 을 설명 합 니 다.
문법:explain SQL 문장:

1explain select * from user where id=1
실행 이 끝 난 후 출력 은 다음 필드 가 있 습 니 다:
  id
  select_type
  table
  partitions
  type
  possible_keys
  key
  key_len
  ref
  rows
  Extra
explain 이름 을 어떻게 사용 하 는 지 알 고 싶 으 면 이 필드 들 을 알 아야 합 니 다.
1. id
SELECT 가 조회 하 는 식별 자 는 모든 SELECT 문 구 는 하나의 유일한 식별 자 를 자동 으로 분배 합 니 다.
2. select_type
각 select 는 자구 의 유형 을 조회 하고 구체 적 인 유형 과 대응 하 는 역할 은 다음 과 같다.
형식 이름
해명 하 다.
SIMPLE
간단 한 SELECT,UNION 이나 하위 검색 등 은 사용 하지 않 습 니 다.
PRIMARY
검색 에 복잡 한 하위 부분 이 포함 되 어 있 으 면 가장 바깥쪽 select 는 PRIMARY 로 표 시 됩 니 다.
UNION
UNION 의 두 번 째 또는 뒤의 SELECT 문구
DEPENDENT UNION
UNION 의 두 번 째 또는 뒤의 SELECT 문 구 는 외부 조회 에 달 려 있 습 니 다.
UNION RESULT
UNION 의 결과
SUBQUERY
하위 검색 의 첫 번 째 SELECT
DEPENDENT SUBQUERY
하위 검색 의 첫 번 째 SELECT 는 외부 검색 에 달 려 있 습 니 다.
DERIVED
파생 표 의 SELECT,FROM 자구 의 하위 조회
UNCACHEABLE SUBQUERY
하위 조회 결 과 는 캐 시 되 지 않 습 니 다.외부 링크 의 첫 줄 을 재평가 해 야 합 니 다.
3. table
이 줄 의 데 이 터 를 표시 하 는 것 은 어떤 시 계 를 찾 는 것 이지 만,때때로 단락 은 실제 표 이름 이 아 닙 니 다.
4. partitions
일치 하 는 파 티 션(이것 은 현재 쓸모 가 없습니다)
5. type
접근 형식 은 MySQL 이 표 에서 필요 한 줄 을 찾 는 방식 을 나타 내 며 해당 하 는 값 과 설명 은 다음 과 같 습 니 다.
형식 이름
우수 등급
해명 하 다.
system
1
시계 가 한 줄 밖 에 없다.
const
2
표 는 최대 일치 하 는 줄 이 있 습 니 다.검색 이 시 작 될 때 읽 힙 니 다.
eq_ref
3
primary key 나 unique key 를 다 중 표 로 연결 하 는 조건 으로 이 표 에서 한 줄 만 읽 습 니 다.
ref
4
검색 조건 의 색인 으로 표 마다 색인 값 과 일치 하 는 줄 을 표 에서 읽 습 니 다.
fulltext
5
전체 텍스트 인덱스 검색
ref_or_null
6
ref 와 일치 하지만 NULL 값 조회 지원 이 추가 되 었 습 니 다.
index_merge
7
색인 통합 최적화 방법 사용
unique_subquery
8
교체 in 하위 검색 사용
index_subquery
9
in 하위 검색 을 바 꾸 었 으 나 하위 검색 에 만 적용 되 는 유일한 색인 이 아 닙 니 다.
range
10
주어진 범위 의 줄 만 검색 하고 하나의 색인 으로 줄 을 선택 합 니 다.
index
11
전체 표를 스 캔 하지만,스 캔 표 의 방식 은 색인 순서에 따라 진행 된다.
ALL
12
표 전체 스 캔 방식 으로 일치 하 는 줄 을 찾 습 니 다.
type 은 방문 유형 으로서 그 값 은 현재 조회 에 사용 되 는 유형 을 대표 하고 성능 을 나타 내 는 중요 한 기준 이다.표 에서 볼 수 있 듯 이 위 에서 아래로 스캐닝 표 의 방식 이 점점 넓 어 지고 성능 도 점점 떨 어 지기 때문에 하나의 조회 에 있어 range 등급 이상 을 유지 하 는 것 이 좋다.
6. possible_keys
검색 이 어떤 색인 으로 표 에서 기록 을 찾 을 수 있 는 지 주동 적 으로 지적 합 니 다.즉,검색 에 있 는 필드 에 색인 이 있 는 필드 를 표시 하지만 반드시 검색 에 사용 되 는 것 은 아 닙 니 다.
7. key
재 검색 에 실제 사 용 된 색인/키 를 표시 합 니 다.색인 이 없 으 면 NULL 을 표시 합 니 다.그러나 강제 조회 에서 possible 를 사용 하거나 무시 하려 면keys 열 에 있 는 색인 은 검색 에서 FORCE INDEX,USE INDEX 또는 IGNORE INDEX 를 사용 할 수 있 습 니 다.
8. key_len
색인 에 사용 할 바이트 수 를 표시 합 니 다.
9. ref
색인 열 에 있 는 값 을 찾 는 데 어떤 열 이나 상수 가 사용 되 는 지 표시 합 니 다.
10. rows
현재 조회 에서 계 산 된 일치 하 는 기록 을 찾 는 데 필요 한 기록 줄 수 를 표시 합 니 다.
11. Extra
현재 검색 에 사용 되 는 해결 방법 을 보 여 줍 니 다.다음 과 같은 몇 가지 상황 이 있 습 니 다.
형식 이름
해명 하 다.
Using where
열 데 이 터 는 색인 에 있 는 정보 만 사용 하고 실제 행동 을 읽 지 않 은 표 에서 되 돌 아 옵 니 다.
Using temporary
MySQL 은 결과 집합 을 저장 하기 위해 임시 표를 사용 해 야 한 다 는 뜻 입 니 다.정렬 과 그룹 검색 에서 흔히 볼 수 있 습 니 다.
Using filesort
MySQL 에서 색인 을 사용 할 수 없 는 정렬 작업 을'파일 정렬'이 라 고 합 니 다.
Using join buffer
변경 값 은 연결 조건 을 가 져 올 때 색인 을 사용 하지 않 고 버퍼 에 연결 하여 중간 결 과 를 저장 해 야 한 다 는 것 을 강조 합 니 다.이 값 이 나 오 면 검색 의 구체 적 인 상황 에 따라 색인 을 추가 하여 개선 할 수 있 음 을 주의해 야 합 니 다.
Impossible where
이 값 은 where 문장 이 조건 에 부합 되 지 않 는 줄 을 초래 할 수 있 음 을 강조 한다.
Select tables optimized away
이 값 은 색인 만 사용 하 는 것 을 의미 합 니 다.유 틸 리 티 는 취 합 함수 결과 에서 한 줄 만 되 돌 릴 수 있 습 니 다.
문법 을 다 말 하고 우 리 는 실제 적 으로 한 파 를 조작 합 니 다.먼저 표를 만 듭 니 다.

--    
CREATE TABLE test(
id INT(11) NOT NULL AUTO_INCREMENT,
uname VARCHAR(255),
PRIMARY KEY(id) 
);
그리고 uname 필드 에 색인 을 추가 합 니 다:

--     
ALTER TABLE test ADD INDEX uname_index (uname);
색인 추가 성공 여부 보기:

--        
SHOW INDEX FROM test;
출력 결 과 는:

색인 이 생 성 되 었 음 을 알 수 있 습 니 다.다음 에 데 이 터 를 추가 합 니 다.

--       
INSERT INTO test VALUES(1,'jay');
INSERT INTO test VALUES(2,'ja');
INSERT INTO test VALUES(3,'bril');
INSERT INTO test VALUES(4,'aybar');
모든 준비 가 다 되 었 습 니 다.다음은 explain 이라는 명령 으로 like 문장 에 색인 이 있 는 지,like 는 네 가지 상황 이 있 습 니 다.각각%,%%,왼쪽%,오른쪽%입 니 다.
1.like 필드 이름

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j'; 
출력:

이 를 통 해 알 수 있 듯 이 type 의 값 은 range 이 고 key 의 값 은 uname 이다.index,즉 이 경우 색인 을 사 용 했 습 니 다.
2.like%필드 이름%

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j%'; 
출력:

이 를 통 해 알 수 있 듯 이 type 의 값 은 ALL,즉 전체 표 스 캔 이 고 key 의 값 은 NULL 입 니 다.즉,색인 을 사용 하지 않 았 습 니 다.
3.like%필드 이름

EXPLAIN SELECT * FROM test WHERE uname LIKE '%j'; 
출력:

이 를 통 해 알 수 있 듯 이 type 의 값 은 ALL 이 고 key 의 값 은 NULL 이 며 색인 을 사용 하지 않 았 습 니 다.
4.like 필드 이름%

EXPLAIN SELECT * FROM test WHERE uname LIKE 'j%'; 
출력:

이 를 통 해 알 수 있 듯 이 type 의 값 은 range 이 고 key 의 값 은 uname 이다.index,즉 이 경우 색인 을 사 용 했 습 니 다.
총결산
위의 시험 에서 like 가 색인 을 사용 하 는 지 여 부 를 정리 할 수 있 습 니 다.like 문 구 는 색인 을 유효 하 게 해 야 합 니 다.like 후%로 시작 할 수 없습니다.즉,(like%필드 이름%)  、(like%필드 이름)과 같은 문 구 는 색인 을 무효 화 할 수 있 으 며,(like 필드 이름),(like 필드 이름%)과 같은 문 구 는 색인 을 정상적으로 사용 할 수 있 습 니 다.
기타
like 색인 문 제 를 확인 하기 위해 MySQL 신기 한 explain 을 연 구 했 습 니 다.그러나 explain 은 색인 사용 상황 만 검사 할 수 있 을 뿐만 아니 라 다른 성능 최적화 에 도 많은 도움 을 줄 수 있 습 니 다.구체 적 인 사용 에 대해 서 는 위 에서 말 한 것 처럼 explain 결 과 를 열거 한 다음 에 덩굴 을 따라 관련 필드 를 찾 아 보면 해당 하 는 내용 을 얻 을 수 있 습 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기