--Java Web 분야의 기술 공유에만 국한되지 않는 이 공개 계정이 좋은 멘토이자 도움이 되는 친구가 되기를 바랍니다. 당신의 프로그래밍 여정. ㅋㅋ
이 기사는 모든 사람에게 도움이 되기를 바라며 주로 Mysql 인덱스 최적화 방법을 공유합니다. 인덱스는 레코드를 빠르게 찾기 위해 스토리지 엔진에서 사용하는 데이터 구조입니다. 특히 테이블의 데이터 양이 점점 더 많아지는 경우 올바른 인덱스를 사용하면 쿼리 성능이 크게 향상됩니다. 그러나 일상 업무에서는 인덱싱이 종종 무시되거나 심지어 오해되기까지 합니다. 이번 글에서는 MySQL 인덱스 최적화의 원칙과 주의사항을 간략하게 소개하겠습니다.
1. 인덱스의 종류
1) B-Tree 인덱스
B-Tree 인덱스는 가장 일반적으로 사용되는 인덱스 유형으로, 대부분의 스토리지 엔진은 B-Tree 인덱스를 지원합니다.
B-Tree 자체는 디스크나 기타 직접 액세스 보조 장치용으로 설계된 균형 검색 트리인 데이터 구조입니다. Mysql의 B-Tree 인덱스는 일반적으로 B-Tree의 변형인 B+Tree로 구현됩니다. 그 구조는 다음과 같습니다.
B+Tree의 특징은 리프 노드에 데이터가 저장되고, 각 리프 노드의 데이터가 동일한 순서(오름차순 또는 내림차순)로 저장되며, 인접한 Leaves 노드는 모두 포인터를 사용하여 한 지점에 연결되어 있습니다. 이 구조는 범위 검색에 매우 적합합니다.
B-트리 인덱스는 스토리지 엔진이 더 이상 필요한 데이터를 얻기 위해 전체 테이블 스캔을 수행할 필요가 없고 인덱스의 루트 노드에서 레이어별로 검색하므로 데이터 액세스 속도를 크게 높일 수 있습니다. 스토리지 엔진의 크기를 줄여 데이터 범위를 스캔하므로 쿼리 속도가 크게 향상됩니다.
2) 해시 인덱스
해시 인덱스는 이름 그대로 해시 테이블을 통해 구현된 인덱스입니다. 그 특징은 인덱스의 모든 열과 정확히 일치하는 경우에만 유효하다는 것입니다. 각 데이터 행에 대해 스토리지 엔진은 모든 인덱스 열에 대한 해시 코드를 계산합니다. 해시 인덱스는 해시 코드를 인덱스에 저장하고 해시 테이블의 각 데이터 행에 대한 포인터를 저장합니다.
Mysql에서는 현재 메모리 엔진만 명시적으로 해시 인덱스를 지원하며, 해시 인덱스는 범위 검색, 정렬, 부분 인덱스 열 일치 검색을 지원하지 않기 때문에 해시 인덱스는 거의 사용되지 않습니다.
다음은 B-Tree 인덱스의 사용법을 중심으로 설명하겠습니다.
다음 설명의 편의를 위해 다음 필드가 있는 사용자 테이블이 있다고 가정합니다.
id: bigint 유형, 기본 키
name: varchar 유형
age: int 유형
interest: varchar 유형
과 A 공동 인덱스 index_1은 이름, 나이, interest로 설정되며 인덱스 순서는 (이름, 나이, interest) 매우 중요하므로 나중에 언급하겠습니다.
2. B-Tree 인덱스 사용법
1) 전체 값 매칭
전체 값 매칭은 name='aaa', age=20인 위의 사용자 테이블을 쿼리하는 것과 같이 인덱스의 모든 열과 일치하는 것을 의미합니다. interest='basketball'은 인덱스의 모든 열을 사용할 수 있습니다.
2) 가장 왼쪽 접두사 일치
가장 왼쪽 접두사 일치는 다중 열 인덱스의 왼쪽 몇 열만 사용하는 것을 의미합니다. 예를 들어 위의 name = 'aaa'인 사용자 테이블 쿼리의 경우 인덱스를 사용할 수 있으며 인덱스의 첫 번째 열만 사용됩니다.
3) 열 접두어 일치
열 접두어 일치는 특정 열의 시작 부분만 일치한다는 의미입니다. 예를 들어 위 사용자 테이블에서 'aaa%'와 같은 이름을 쿼리하는 경우 인덱스를 사용할 수 있습니다. 은 일치하는 열의 시작입니다. 쿼리가 '%aaa'와 같은 이름인 경우 인덱스를 사용할 수 없습니다.
4) 범위 값 일치
예를 들어 name > 'aaa' 및 name < 'bbb'인 위의 사용자 테이블을 쿼리하는 경우에도 인덱스를 사용할 수 있습니다.
5) 특정 열과 범위가 정확히 일치하고 다른 열과 일치합니다
name='aaa'이고 age가 10보다 큰 위 사용자 테이블을 쿼리하면 인덱스를 사용할 수 있으며 인덱스의 처음 2개 열을 사용할 수 있습니다.
3. B-Tree 인덱스의 한계
1) 인덱스의 가장 왼쪽 열부터 검색을 시작하지 않으면 해당 인덱스를 사용할 수 없습니다.
age=20인 위의 사용자 테이블을 쿼리하면 age가 인덱스 열의 가장 왼쪽 데이터 열이 아니기 때문에 인덱스를 사용할 수 없습니다.
2) 인덱스의 열은 건너뛸 수 없습니다.
name='aaa', interest='football'인 위 사용자 테이블을 쿼리할 경우 where 조건에 age 열이 포함되지 않으므로 인덱스의 첫 번째 열만 사용할 수 있습니다.
관련 권장 사항:
mysql 인덱스 최적화 사용 방법
MySQL Advanced 13 - 인덱스를 통해 SQL 최적화
MySQL 순서별 인덱스 최적화 방법