[sql] select 문에서 인덱스를 사용하는 방법은 무엇입니까?

employee 테이블 emp_name에서 테이블 열에 인덱스 (idx_name)를 생성했다고 가정 해 보겠습니다 .

select 절에서 인덱스 이름을 명시 적으로 지정해야합니까? 아니면 쿼리 속도를 높이기 위해 자동으로 사용됩니다.

select 절에서 지정해야하는 경우 select 쿼리에서 index를 사용하는 구문은 무엇입니까?



답변

색인이 작동하는지 테스트하려면 다음 구문이 있습니다.

SELECT *
FROM Table WITH(INDEX(Index_Name))

WITH 문은 인덱스를 강제로 사용합니다.


답변

좋은 질문,

일반적으로 DB 엔진은 빌드하는 쿼리 실행 계획에 따라 사용할 인덱스를 자동으로 선택해야합니다. 그러나 DB가 특정 인덱스를 사용하도록 강제하려는 경우 매우 드문 경우가 있습니다.

특정 질문에 답하려면 사용중인 DB를 지정해야합니다.

MySQL의 경우 이를 수행하는 방법에 대한 인덱스 힌트 구문 문서 를 읽고 싶습니다.


답변

select 문에서 인덱스를 사용하는 방법은 무엇입니까?
이 방법:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;

SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

그리고 더 많은 방법 이 이것을 확인 합니다.

명시 적으로 지정해야합니까?

  • 아니요, 명시 적으로 지정할 필요가 없습니다.
  • DB 엔진은 @Tudor Constantin 답변에서 구축 한 쿼리 실행 계획에 따라 사용할 인덱스를 자동으로 선택해야합니다.
  • 옵티마이 저는 인덱스를 사용하면 쿼리가 더 빠르게 실행되는지 여부를 판단하고, 그렇다면 인덱스를 사용합니다. @niktrl 답변에서

답변

일반적 으로 인덱스를 사용하는 데 드는 비용이 추가로 북마크 조회를 수행해야하는 비용이 전체 테이블을 스캔하는 비용보다 낮을 경우 인덱스가 사용됩니다.

쿼리가 다음 형식 인 경우 :

SELECT Name from Table where Name = 'Boris'

그리고 1000 개 중 1 개 행은 Boris라는 이름을 가지고 있으며 거의 ​​확실히 사용됩니다. 모든 사람의 이름이 Boris 인 경우 인덱스가 데이터에 액세스하는 데 더 효율적인 전략이 될 가능성이 낮으므로 테이블 스캔에 의존 할 것입니다.

넓은 테이블 (많은 열)이고 다음을 수행하는 경우 :

SELECT * from Table where Name = 'Boris'

그런 다음 테이블에서 다른 열을 검색하는 것이 이름을 찾는 것보다 더 많은 시간이 걸릴 것이라는 합리적인 가정이라면 테이블 스캔을 수행하도록 선택할 수 있습니다. 어쨌든 많은 행.


답변

옵티마이 저는 인덱스를 사용하면 쿼리가 더 빠르게 실행되는지 여부를 판단하고, 그렇다면 인덱스를 사용합니다.

RDBMS에 따라 색인 사용을 강제 할 수 있지만 수행중인 작업을 알지 못하는 경우 권장되지 않습니다.

일반적으로 테이블 조인 및 where 문에서 사용하는 열을 인덱싱해야합니다.


답변

조건 내에서 인덱스가 적용되는 컬럼을 사용하면 자동으로 포함됩니다. 사용할 필요는 없지만 사용할 때 쿼리 속도가 빨라집니다.

SELECT * FROM TABLE WHERE attribute = 'value'

적절한 색인을 사용합니다.


답변

일반적으로 테이블에 인덱스를 만들면 데이터베이스는 해당 테이블의 데이터를 검색하는 동안 해당 인덱스를 자동으로 사용합니다. 그것에 대해 아무것도 할 필요가 없습니다.

그러나 MSSQL에서는 index hint이 쿼리를 실행하는 데 특정 인덱스를 사용해야 함을 지정할 수있는을 지정할 수 있습니다. 이에 대한 자세한 내용은 여기 에서 찾을 수 있습니다 .

Index hintMySQL 에서도 사용할 수있는 것 같습니다 . 튜더 콘스탄틴에게 감사드립니다.