집 >데이터 베이스 >MySQL 튜토리얼 >mysql 최적화 (2) 인덱스 최적화 전략
1: 인덱스 유형
인덱스: 빠른 쿼리용
노드 레벨 1, 2의 0승
노드 레벨 1, 2 ~ 1차
노드 레벨 3, 2 ~ 2차
노드 레벨 4, 2 ~ 3차
노드 레벨 5 레이어, 2 4승
. . .
. . .
. . .
노드 레벨 31, 2의 32승
최대 42억개
즉, 42억개의 숫자를 최대 32번까지 확인할 수 있습니다.
일반적인 쿼리에는 21억 번의 검색이 필요합니다
이것은------>B-tree 인덱스
참고: btree 인덱스라고 합니다. 큰 그림에서는 둘 다 균형 트리를 사용하지만 구체적인 구현 측면에서는 각 엔진이 약간 다릅니다.
예를 들어 엄밀히 말하면 NDB 엔진은 T-트리를 사용합니다
Myisam, innodb 에서는 B-트리 인덱스가 기본적으로 사용됩니다
그러나 추상적으로 B-트리 시스템은 "정렬된 빠른 검색 구조"로 이해될 수 있습니다
1.2 해시 인덱스 스프링 ㅋㅋㅋㅋㅋㅋㅋ . . 니마니마. . .
메모리 테이블에서 기본값은 해시 인덱스입니다.
해시의 이론적 쿼리 시간 복잡도는 O(1)입니다.
질문: 해시 검색은 이렇게 효율적인데 해시 인덱스를 사용하면 어떨까요?
답변:
1: 해시 함수로 계산한 결과는 무작위입니다. 데이터가 디스크에 저장되어 있으면
알고리즘을 사용하세요. . . . .
예를 들어 기본 키가 id라면 id가 커질수록
id에 해당하는 행이 디스크에 무작위로 배치됩니다. !
해시 알고리즘은 규칙 없이 디스크 공간을 할당합니다! ! !
2: 범위 쿼리를 최적화할 수 없습니다. 3: 접두사 인덱스를 사용할 수 없습니다.
예를 들어 btree에서 필드 열의 값은 "hellopworld"이고 인덱스는
xx=helloword를 쿼리하려면 자연스럽게 인덱스 xx=hello를 사용하거나 인덱스
(왼쪽 접두사 인덱스)
를 사용할 수도 있습니다. 'helloword')와 hash('hello')는 모두 둘 사이의 관계가 여전히 무작위입니다
4: 정렬을 최적화할 수 없습니다.
5: 행 지원이 필요합니다. 즉, 인덱스를 통해 데이터 위치를 얻어 데이터를 테이블로 반환해야 합니다
------>뒤로 가서 검색하면 해당 디렉토리는 그냥 사전이고 실제로 페이지를 넘겨야 합니다
2: btree 인덱스에 대한 일반적인 오해
2.1 Where 조건에서 자주 사용되는 열에 인덱스를 추가합니다
예 : where cat_id=3 and Price>100; //세 번째 열 쿼리, 100위안 초과 제품
오류: cat_id, and, 가격에 인덱스가 추가됩니다.
오류: cat_id만 또는 Price index는 독립된 인덱스이므로 동시에 하나만 사용할 수 있습니다.
alter table add index(cat_id)
alter table add index(price)
alter table add index(goods_id) ----- ----------동시에 하나만 사용할 수 있습니다. . . . . 공동 인덱스는 여러 열을 전체 값
인덱스(cat_id, 상품_이름, 가격)로 처리합니다 ------------ - - 여러 열을 전체 값으로 처리
2.2 여러 열에 인덱스를 생성한 후 어떤 열을 쿼리해도 인덱스가 작동합니다.
오류: 다중 열 인덱스가 작동하려면 왼쪽 접두사 요구 사항을 충족해야 합니다.
///접두사 요구 사항 만들기
인덱스(a,b,c)를 예로 들어 보겠습니다. 순서에 따라 다름)
인덱스가 작동합니까?
예, a열만 사용됩니다
예, a열과 b열이 사용됩니다
예, abc를 사용합니다
아니요
a열은 인덱스 기능을 할 수 있지만 c열은 인덱스 기능을 할 수 없습니다
A는 사용할 수 있고, b는 사용할 수 있고, C는 사용할 수 없습니다
A는 사용할 수 있고, B는 사용할 수 있고, C는 사용할 수 없습니다.
정확히 일치하면 보드의 길이가 10미터입니다.
예를 들어, 왼쪽 접두사와 범위 쿼리를 수행하면 보드 길이가 5미터가 됩니다.
직접 접합할 수 있습니다. 강 반대편을 건너면 인덱스 여부를 알 수 있습니다.
위의 예와 같이 a=3, b>10, c=7인 경우
보드의 길이는 10m, A 열 인덱스가 작동합니다
A보드는 B보드에 정상적으로 연결되어 있고, B보드의 인덱스는 작동합니다
B보드는 길이가 짧아서 C보드에 연결할 수 없으며,
C열의 인덱스는 작동하지 않습니다.