개요 단일 지수란 무엇이고 복합 지수는 무엇인가요? 새로운 종합 지수를 언제 생성해야 하며, 종합 지수에서 주의해야 할 점은 무엇인가요? 이 글은 주로 인터넷에서 이루어진 몇몇 논의를 요약한 것입니다.
1. 컨셉
단일 인덱스는 인덱스가 한 열에 나열되는 상황으로, 즉 새로운 인덱스 생성 문장이 한 열에만 구현되는 경우입니다.
사용자는 여러 열에 걸쳐 인덱스를 만들 수 있으며, 이를 복합 인덱스(결합 인덱스)라고 부릅니다. 복합 인덱스는 단일 인덱스와 정확히 동일한 방식으로 생성됩니다. 하지만 복합 인덱스는 데이터베이스 작업 시 오버헤드가 적고 여러 개의 단일 인덱스를 대체할 수 있습니다. 테이블의 행 수가 키 수보다 훨씬 많을 때, 이 방법은 테이블의 쿼리 속도를 크게 높일 수 있습니다.
두 가지 개념이 동시에 존재하는데, 좁은 인덱스와 넓은 인덱스이며, 좁은 인덱스는 1-2열의 인덱스를 의미하며, 별도의 명시가 없는 한 일반적으로 단일 인덱스를 가리킵니다. 넓은 인덱스는 2열 이상인 인덱스입니다.
지수 설계의 중요한 원칙 중 하나는 넓은 지수 대신 좁은 지수를 사용하는 것입니다. 좁은 지수가 결합된 지수보다 더 효과적인 경향이 있기 때문입니다. 더 좁은 인덱스를 두면 최적화 도구가 더 많은 선택지를 가질 수 있어 성능 향상에 도움이 됩니다.
2. 사용
인덱스 생성 table1(col1, col2, col3)에서 인덱스 idx1을 생성합니다. 묻다 table1에서 *를 선택하는데, 여기서 col1= A, col2= B, col3 = C
이 시점에서 쿼리 옵티마이저는 테이블을 스캔하는 것이 아니라 인덱스에서 직접 데이터를 가져옵니다. 이 데이터는 인덱스에 포함되어 있어 오버레이 쿼리라고 하며, 쿼리 속도가 매우 빠릅니다.
3. 노트:
1. 복합 지수를 사용할 때 where(where) 조건에서는 필드가 인덱싱되며, 여러 필드가 사용될 경우 복합 인덱스가 사용됩니다. 일반적으로 select 필드에 인덱스를 만들지 마세요(mytable에서 select를 col1, col2, col3로 쿼리하려면 위의 인덱스가 필요하지 않습니다). 조건에 따라 색인화하는 것은 매우 중요한 원칙입니다. 인덱스를 너무 많이 사용하지 않도록 주의하세요. 그렇지 않으면 테이블 업데이트 효율에 큰 영향을 줄 수 있습니다. 테이블을 운영할 때 인덱스를 만드는 데 많은 시간을 들여야 하기 때문입니다.
2. 복합 인덱스의 경우, 쿼리를 사용할 때는 인덱스를 찾는 순서를 따르는 것이 가장 효율적입니다. 예를 들어: IDX1: table1(col2, col3, col5)에서 인덱스 idx1 생성 table1에서 *를 선택하는데, 여기서 col2=A, col3=B, col5=D
만약 "table1에서 *를 선택하고, 여기서 col3=B, col2=A, col5=D"라면, 또는 "table1에서 *를 선택해 col3=B"가 인덱스를 사용하지 않거나 효과가 눈에 띄지 않습니다
3. 복합 지수가 단일 지수를 대체할 것인가? 많은 사람들이 클러스터 인덱스에 어떤 필드든 추가하면 쿼리 속도를 높일 수 있다고 생각하지만, 혼동하는 사람들도 있습니다: 복합 클러스터 인덱스 필드를 별도로 쿼리하면 쿼리 속도가 느려지나요? 이 질문과 함께 다음 쿼리 속도(결과 집합은 250,000개의 데이터)를 살펴보겠습니다. :( 날짜 열인 fariqi가 복합 집계 인덱스의 시작 열에서 1위, 사용자 이름인 neibuyonghu가 2위에 위치합니다.
IDX1:create index idx1 on Tgongwen(fariqi,neibuyonghu)
(1) 공문에서 기드, 파리치, 네이부융후, 칭호를 선택한다 여기서 파리키>'2004-5-5'
쿼리 속도: 2513 ms
(2) 공문에서 기드, 파리치, 네이부융후, 칭호를 선택한다 여기서 fariqi>'2004-5-5'와 neibuyonghu='사무실'
쿼리 속도: 2516ms
(3) 공문에서 기드, 파리치, 네이부융후의 칭호를 선택한다 여기서 네이부융후='사무실'
쿼리 속도: 60280밀리초
위 실험들에서 보면, 클러스터 인덱스의 시작 열만 쿼리 조건으로 사용할 경우, 복합 클러스터 인덱스를 가진 모든 열의 쿼리 속도는 거의 동일하며, 쿼리 결과 집합 수가 같을 때 모든 복합 인덱스 컬럼을 사용할 때보다 약간 더 빠릅니다. 복합 집계 인덱스의 시작 열이 아닌 열만 쿼리 조건으로 사용한다면, 이 인덱스는 아무런 반응을 보이지 않습니다. 물론 1과 2의 쿼리 속도는 동일합니다. 쿼리의 항목 수가 같기 때문입니다. 복합 인덱스의 모든 열을 사용하고 쿼리 결과가 적으면 "인덱스 오버라이드"가 형성되어 성능을 최적화할 수 있습니다. 또한, 집계 인덱스에서 다른 열을 자주 사용하든 아니든, 앞쪽 열이 가장 자주 사용되어야 한다는 점을 기억하세요.
[참고: 쿼리 최적화 및 페이지네이션 알고리즘 스킴 http://blog.csdn.net/chiefsailor/archive/2007/05/28/1628339.aspx]
4. 같은 열에 단일 인덱스와 합성 인덱스를 동시에 만들어야 하나요? 실험: Sysbase 5.0 테이블 테이블 필드: col1, col2, col3
테스트 단계: (1) col1에 인덱스 idx1을 생성 table1에서 col1=A가 idx1을 사용하는 table1에서 select * 실행하세요. table1에서 col1=A와 col2=B가 idx1을 사용하는 table1에서 select *를 실행하세요.
(2) 인덱스 idx1을 삭제한 후 (col1,col2) 복합 인덱스에 idx2를 생성합니다 두 쿼리 모두 idx2를 사용합니다
(3) 두 인덱스 idx1과 idx2가 모두 존재할 경우 col1='A'가 idx1을 사용하는 곳이 아니라, col1=A, col2=B가 idx2를 사용하는 경우입니다. 쿼리 옵티마이저는 이전에 널리 사용된 인덱스 중 하나를 사용합니다. idx1이나 idx2를 사용하세요.
다음과 같이 볼 수 있습니다 (1) 테이블의 경우, (col1, col2) 위에 복합 인덱스가 존재하면, 동시에 col1에 단일 인덱스를 만들 필요가 없다. (2) 쿼리 조건이 요구한다면, 이미 col1에 단일 인덱스가 있을 때 (col1, col2) 위에 복합 인덱스를 추가할 수 있어, 효율성을 어느 정도 향상시킬 수 있습니다. (3) 여러 필드(5개 또는 6개 필드를 포함)를 동시에 포함하는 복합 인덱스를 설정하는 데 큰 이점은 없지만, 상대적으로 여러 좁은 필드(하나 또는 최대 2개 필드만 포함하는 인덱스)를 설정하는 것이 더 높은 효율성과 유연성을 달성할 수 있습니다.
5. 쿼리를 다뤄야 하나요? 일반적으로 전체 쿼리 보도를 강조하는 전략을 사용하는 것은 피하는 것이 좋습니다. Select 절의 모든 열이 비클러스터 인덱스로 덮어쓰여 있다면, 옵티마이저는 이를 인식하고 좋은 성능을 제공합니다. 하지만 이로 인해 지수가 지나치게 넓어지고 최적화자가 정책을 사용할 가능성에 지나치게 의존하게 되는 경우가 많습니다. 일반적으로 좁은 인덱스는 더 많은 쿼리에 사용되며, 이는 큰 쿼리에서 더 나은 성능을 제공합니다. |