조건에 따라 모든 조건 및 모든 조인 조건을 조회해야합니다. 둘은 똑같이 작동합니다. 가정하자
우리는
select name
from customer
where customerid=37;
은 어떻게 든 DBMS가 CustomerID를 = 37 기록 또는 기록을 찾을 수있다 물품. 색인이없는 경우이를 수행하는 유일한 방법은 고객 ID를 37과 비교하는 테이블의 모든 레코드를 읽는 것입니다. 하나를 찾았더라도 하나만 있다는 것을 알 수있는 방법이 없으므로 계속 찾고 있어야합니다 다른 사람.
인덱스를 customerid에 만들면 DBMS는 인덱스를 매우 빠르게 검색 할 수 있습니다. 순차 검색이 아니지만 데이터베이스에 따라 이진 검색이나 다른 효율적인 방법이 있습니다. 정확히 어떻게 중요하지는 않지만 순차적 인 것보다 훨씬 빠릅니다. 그런 다음 색인은 해당 레코드 나 레코드로 직접 이동합니다. 또한 인덱스가 "고유"하다고 지정하면 데이터베이스는 하나만 존재할 수 있으므로 초를 찾는 데 시간을 낭비하지 않습니다. (그리고 DBMS 두 번째를 추가 할 수 없습니다.)
지금이 쿼리를 고려해
select name
from customer
where city='Albany' and state='NY';
이제 우리는 두 가지 조건이있다. 해당 필드 중 하나에만 색인이있는 경우 DBMS는 해당 색인을 사용하여 레코드의 하위 집합을 찾은 다음 순차적으로 검색합니다.예를 들어 상태에 대한 인덱스가있는 경우 DBMS는 NY의 첫 번째 레코드를 빠르게 찾은 다음 city = 'Albany'를 찾아 순차적으로 검색하고 NY의 마지막 레코드에 도달하면 검색을 중지합니다.
"고객 (주, 도시)에 색인 생성"과 같은 두 개의 필드를 모두 포함하는 색인이있는 경우 DBMS는 바로 오른쪽 레코드를 확대/축소 할 수 있습니다.
각 필드에 하나씩 인덱스가 두 개인 경우 DBMS는 적용 할 다양한 규칙을 사용하여 사용할 인덱스를 결정합니다. 다시 말하지만이 작업은 사용중인 특정 DBMS에 따라 다르지만 기본적으로 총 레코드 수, 다른 값의 수 및 값의 분포에 대한 통계를 유지하려고합니다. 그런 다음 다른 조건을 만족하는 레코드를 순차적으로 검색합니다. 이 경우 DBMS는 주보다 많은 도시가 있다는 것을 관찰 할 수 있으므로 도시 인덱스를 사용하여 '알바니'레코드를 빠르게 확대 할 수 있습니다. 그런 다음 순차적으로 검색하여 'NY'에 대한 각 상태를 확인합니다. 캘리포니아 알바니에 대한 기록이있는 경우이 기록을 건너 뜁니다.
모든 가입에는 조회가 필요합니다.
우리가
select customer.name
from transaction
join customer on transaction.customerid=customer.customerid
where transaction.transactiondate='2010-07-04' and customer.type='Q';
이제 DBMS가 먼저 읽고 거기에서 해당 레코드를 선택하고 다른 테이블에서 일치하는 레코드를 찾을 수있는 테이블을 결정해야 쓰기 말.
transaction.transactiondate 및 customer.customerid에 대한 인덱스가있는 경우 가장 좋은 계획은이 날짜의 모든 트랜잭션을 찾은 다음 일치하는 고객 ID로 고객을 찾은 다음 확인하는 것입니다 고객이 올바른 유형인지 확인하십시오.
customer.customerid에 색인이없는 경우 DBMS는 신속하게 트랜잭션을 찾을 수 있지만 각 트랜잭션마다 일치하는 고객 ID를 찾는 고객 테이블을 순차적으로 검색해야합니다. (이것은 매우 느릴 수 있습니다.)
대신에 소유 한 색인 만 transaction.customerid 및 customer.type에 있다고 가정합니다. 그런 다음 DBMS는 완전히 다른 계획을 사용할 것입니다. 올바른 유형의 모든 고객에 대해 고객 테이블을 스캔 한 다음 이들 각각에 대해이 고객에 대한 모든 트랜잭션을 찾아 올바른 날짜로 순차적으로 검색합니다.
최적화의 가장 중요한 핵심은 어떤 인덱스가 실제로 해당 인덱스를 도울 것인지를 결정하는 것입니다. 여분의 사용되지 않는 색인은 데이터베이스를 관리하는 데 걸리므로 데이터베이스에 부담이되며 사용하지 않으면 낭비됩니다.
EXPLAIN 명령을 사용하여 주어진 쿼리에 대해 DBMS가 사용할 인덱스를 알 수 있습니다. 나는 내 쿼리가 잘 최적화되고 있는지 또는 추가 인덱스를 작성해야 하는지를 결정할 때이 모든 것을 사용합니다.
주의 사항 : DBMS는 레코드 수와 각기 다른 값의 수 등에 대한 통계를 보관한다는 것을 기억하십시오. 데이터가 변경된 경우 EXPLAIN은 어제보다 완전히 다른 계획을 제공 할 수 있습니다. 예를 들어, 두 테이블을 조인하는 쿼리가 있고이 테이블 중 하나가 매우 작고 다른 테이블이 큰 경우 작은 테이블을 먼저 읽은 다음 큰 테이블에서 일치하는 레코드를 찾는쪽으로 편향됩니다. 테이블에 레코드를 추가하면 더 큰 테이블을 변경할 수 있으므로 DBMS가 계획을 변경하게됩니다. 따라서 실제 데이터가있는 데이터베이스에 대해 EXPLAINS를 시도해야합니다. 각 테이블에 5 개의 레코드가있는 테스트 데이터베이스에 대해 실행하는 것은 실제 데이터베이스에 대해 실행하는 것보다 훨씬 저렴합니다.
음, 훨씬 더 말할 수 있지만, 여기에 책을 쓰고 싶지는 않습니다.
와우, 많은 정보입니다. 감사합니다.이 글을 읽고 몇 가지 사실을 배웠습니다. 즉시 사용하다 – walnutmon