인덱싱에 대해 읽는 데 시간을 투자해야하며 그것에 대해 많은 글이 있으며 무슨 일이 일어나고 있는지 이해하는 것이 중요합니다.
대체로 인덱스는 테이블의 행에 순서를 부과합니다.
간단히하기 위해 테이블이 큰 CSV 파일이라고 가정 해보십시오. 행이 삽입 될 때마다 끝에 삽입 됩니다 . 따라서 테이블의 "자연스러운"순서는 행이 삽입 된 순서입니다.
매우 기본적인 스프레드 시트 응용 프로그램에 CSV 파일이로드되었다고 가정합니다. 이 스프레드 시트는 데이터를 표시하고 행에 순차적으로 번호를 매 깁니다.
이제 세 번째 열에서 "M"값을 가진 모든 행을 찾아야한다고 상상해보십시오. 사용 가능한 것을 감안할 때 하나의 옵션 만 있습니다. 각 행의 세 번째 열 값을 확인하여 테이블을 스캔합니다. 많은 행이있는 경우이 방법 ( "테이블 스캔")에 시간이 오래 걸릴 수 있습니다!
이제이 표 외에 색인이 있다고 가정하십시오. 이 특정 인덱스는 세 번째 열의 값 인덱스입니다. 색인은 세 번째 열의 모든 값을 의미있는 순서 (알파벳순)로 나열하고 각각에 대해 해당 값이 나타나는 행 번호 목록을 제공합니다.
이제 세 번째 열의 값이 "M"인 모든 행을 찾는 좋은 전략이 있습니다. 예를 들어 이진 검색을 수행 할 수 있습니다 ! 테이블 스캔에서는 N 개의 행을보아야하지만 (여기서 N은 행 수임) 바이너리 검색에서는 최악의 경우 log-n 인덱스 항목 만보아야합니다. 와우, 훨씬 쉬워요!
물론이 인덱스가 있고 테이블에 행을 추가하는 경우 (결국 개념 테이블이 작동하는 방식이므로) 인덱스를 매번 업데이트해야합니다. 따라서 새로운 행을 작성하는 동안 약간의 작업을 수행하지만 무언가를 검색 할 때 시간을 절약 할 수 있습니다.
따라서 일반적으로 인덱싱은 읽기 효율성과 쓰기 효율성 간의 균형을 유지합니다. 인덱스가 없으면 삽입 속도가 매우 빠를 수 있습니다. 데이터베이스 엔진은 테이블에 행을 추가하기 만합니다. 색인을 추가 할 때 엔진은 삽입을 수행하는 동안 각 색인을 업데이트해야합니다.
반면에 읽기는 훨씬 빨라집니다.
바라건대 첫 두 질문 (다른 사람들이 대답했듯이 올바른 균형을 찾아야 함)을 다루기를 바랍니다.
세 번째 시나리오는 조금 더 복잡합니다. LIKE를 사용하는 경우 인덱싱 엔진은 일반적으로 첫 번째 "%"까지 읽기 속도를 도와줍니다. 즉, 'foo % bar %'와 같은 열을 선택하는 경우 데이터베이스는 색인을 사용하여 열이 "foo"로 시작하는 모든 행을 찾은 다음 해당 하위 행 세트를 스캔하여 서브 세트를 찾습니다. "바"를 포함합니다. SELECT ... WHERE 열 LIKE '% bar %'은 (는) 인덱스를 사용할 수 없습니다. 왜 그런지 알 수 있기를 바랍니다.
마지막으로 두 개 이상의 열에서 인덱스에 대해 생각해야합니다. 개념은 동일하며 LIKE와 유사하게 작동합니다. 기본적으로 (a, b, c)에 색인이 있으면 엔진은 가능한 한 왼쪽에서 오른쪽으로 색인을 계속 사용합니다. 따라서 열 a에서 검색 할 때 (a, b)에서와 같이 (a, b, c) 색인을 사용할 수 있습니다. 그러나 b = 5 AND c = 1 인 곳을 검색하는 경우 엔진에서 전체 테이블 스캔을 수행해야합니다.
이 방법이 약간 도움이 되길 바랍니다. 그러나 이러한 내용을 자세히 설명하는 좋은 기사를 찾기 위해 몇 시간을 투자하는 것이 가장 좋습니다. 특정 데이터베이스 서버의 설명서를 읽는 것도 좋습니다. 쿼리 플래너가 인덱스를 구현하고 사용하는 방법은 매우 다양 할 수 있습니다.