programing

MySQL의 다중 컬럼인덱스 필드 순서가 중요합니까?

luckcodes 2023. 1. 21. 10:14

MySQL의 다중 컬럼인덱스 필드 순서가 중요합니까?

인덱스의 중요성과 결합 순서가 성능을 어떻게 변화시킬 수 있는지 알고 있습니다.저는 여러 개의 열 인덱스에 관한 많은 책을 읽었지만 제 질문에 대한 답을 찾지 못했어요.

다중 열 인덱스를 할지, 지정된 순서가 중요한지 궁금합니다.제 추측으로는 그렇지 않을 것이고, 엔진은 주문은 중요하지 않은 집단으로 그들을 대할 것입니다.하지만 나는 확인하고 싶다.

예를 들어 mysql 웹사이트(http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html))에서 확인할 수 있습니다.

CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
);

아래가 더 나은 경우 또는 동등한 경우, 베네핏이 있습니까?

CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (first_name,last_name)
);

구체적으로는:

INDEX name (last_name,first_name)

INDEX name (first_name,last_name)

다열 인덱스를 논할 때 전화번호부에 비유합니다.전화번호부는 기본적으로 성과 이름의 색인입니다.따라서 정렬 순서는 어떤 "열"이 첫 번째인지에 따라 결정됩니다.검색은 몇 가지 범주로 나뉩니다.

  1. 스미스라는 성을 가진 사람들을 찾아보면, 그 책은 성별로 정렬되어 있기 때문에 쉽게 찾을 수 있다.

  2. 존이라는 이름을 가진 사람들을 찾아보면 전화번호부는 도움이 되지 않는다. 왜냐하면 존 가족은 책 곳곳에 흩어져 있기 때문이다.전화번호부를 다 뒤져봐야 찾을 수 있어요.

  3. 스미스라는 특정 성을 가진 사람과 존이라는 특정 이름을 가진 사람을 찾아보면 이 책이 도움이 됩니다. 왜냐하면 스미스 부부는 함께 정렬되어 있고 스미스 가족 내에서도 정렬되어 있기 때문입니다.

전화번호부를 이름 순으로 정렬하고 성별로 정렬하면 위의 사례 #2와 #3에서 도움이 되지만 사례 #1에서는 그렇지 않습니다.

따라서 정확한 값을 찾는 경우가 설명되지만 값의 범위를 기준으로 검색하면 어떻게 됩니까?이름이 존이고 성이 'S'로 시작하는 모든 사람(Smith, Saunders, Staunton, Sherman 등)을 찾고 싶다고 가정해 보십시오.Johns는 각 성에서 J로 정렬되지만, 모든 성에서 S로 시작하는 경우 Johns는 함께 분류되지 않습니다.다시 흩어지기 때문에 결국 성이 'S'로 시작하는 모든 이름을 스캔해야 합니다.전화번호부가 성별로 정리되어 있으면 모든 존이 함께 있고존스 내에서는 모든 S자가 함께 분류되어 있습니다

따라서 다중 열 인덱스의 열 순서가 매우 중요합니다.한 유형의 쿼리에는 인덱스에 대한 특정 열 순서가 필요할 수 있습니다.여러 유형의 쿼리가 있는 경우 열을 서로 다른 순서로 사용하여 여러 인덱스가 필요할 수 있습니다.

자세한 내용은 내 프레젠테이션 인덱스 설계 방법을 참조하십시오.

두 인덱스가 다릅니다.MySQL 및 기타 데이터베이스에서도 마찬가지입니다.MySQL은 설명서에서 차이를 잘 설명합니다.

다음 두 가지 인덱스를 고려합니다.

create index idx_lf on name(last_name, first_name);
create index idx_fl on name(first_name, last_name);

이 두 가지 모두 다음 항목에서 동일하게 작동해야 합니다.

where last_name = XXX and first_name = YYY

idx_lf는 다음 조건에 최적입니다.

where last_name = XXX
where last_name like 'X%'
where last_name = XXX and first_name like 'Y%'
where last_name = XXX order by first_name

idx_fl은 다음 경우에 최적입니다.

where first_name = YYY
where first_name like 'Y%'
where first_name = YYY and last_name like 'X%'
where first_name = XXX order by last_name

이러한 경우 대부분 두 인덱스를 모두 사용할 수 있지만 한 인덱스가 최적입니다.예를 들어 idx_lf와 쿼리를 함께 고려합니다.

where first_name = XXX order by last_name

를 사용하여 MySQL idx_lf 뒤에 할 수 .order by(MySQL의 경우) 실제로는 최적화 옵션이 아닌 것 같습니다만, 다른 데이터베이스에서는 이 옵션이 발생할 수 있습니다.

일반적으로 다중 색인에서 가장 선택적인 항목, 즉 가장 적은 결과를 제공하는 항목을 먼저 배치해야 합니다.따라서 테이블 위에 여러 개의 컬럼 인덱스를 작성하는 경우status값의 및 "10개의 의 10개의 10개의 10개의 10개의 10개의 10개의 10개의 10개의 10개의 10개의 10개의 10개의 10개의 a가 있습니다.dateAdded보통 있습니다.

SELECT * FROM myTable WHERE status='active' and dateAdded='2010-10-01'

당신은그러면 당신은dateAdded첫째, 이렇게 하면 스캔이 행의 10%(또는 '활성' 비율에 관계없이)가 아닌 몇 개의 행으로 제한되기 때문입니다.

이것은 꽤 많은 생각과 조정이 필요하다; 당신은 Lahdenmaki와 Leach의 책을 봐야 한다.

언급URL : https://stackoverflow.com/questions/24315151/does-order-of-fields-of-multi-column-index-in-mysql-matter