>  기사  >  데이터 베이스  >  mysql 최적화 (2) 인덱스 최적화 전략

mysql 최적화 (2) 인덱스 최적화 전략

黄舟
黄舟원래의
2016-12-29 16:06:021229검색

1: 인덱스 유형

인덱스: 빠른 쿼리용

mysql 최적화 (2) 인덱스 최적화 전략

노드 레벨 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=3


예, a열만 사용됩니다


a=3, b=5인 경우


예, a열과 b열이 사용됩니다


a=3, b=5, c=4


예, abc를 사용합니다


b=3 / c=4


아니요


a=3이고 c=4인 경우


a열은 인덱스 기능을 할 수 있지만 c열은 인덱스 기능을 할 수 없습니다


a=3이고 b>10이고 c=7인 경우


A는 사용할 수 있고, b는 사용할 수 있고, C는 사용할 수 없습니다


같음 위의 경우 a=3 및 b는 'xxxx%' 및 c=7과 같습니다.


A는 사용할 수 있고, B는 사용할 수 있고, C는 사용할 수 없습니다.


이해하기 쉽게, ABC가 각각 길이가 10미터이고 강의 폭이 30미터라고 가정합니다.


정확히 일치하면 보드의 길이가 10미터입니다.

예를 들어, 왼쪽 접두사와 범위 쿼리를 수행하면 보드 길이가 5미터가 됩니다.



직접 접합할 수 있습니다. 강 반대편을 건너면 인덱스 여부를 알 수 있습니다.

위의 예와 같이 a=3, b>10, c=7인 경우

보드의 길이는 10m, A 열 인덱스가 작동합니다

A보드는 B보드에 정상적으로 연결되어 있고, B보드의 인덱스는 작동합니다

B보드는 길이가 짧아서 C보드에 연결할 수 없으며,
C열의 인덱스는 작동하지 않습니다.

위 내용은 mysql 최적화 (2) 인덱스 최적화 전략에 대한 내용입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!



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