2014-06-09 3 views
0

테이블이 있습니다. 제품.
그것 가지고 다음 columms :
ID
AdminID
카테고리 ID
이 테이블에 일부 쿼리 될 것입니다 만 AdminID (Q1) 만 카테고리 ID에 대한 몇 가지 (에 Q2). 그러나 AdminIDCategoryID (Q3)과 같은 두 가지 검색어에 대한 검색어가 거의 없습니다. 지수 1과 AdminID의 위치에 AdminID카테고리 ID 모두
SQL 테이블에 다중 열 인덱스와 단일 열 인덱스를 모두 생성합니다.

  • 지수 :
    이이 경우에 내가 (ID에서 하나 제외) 2 개 인덱스를 만드는 데 필요한 것으로 보인다. 이것은 Q1Q3을 처리해야합니다.
  • 인덱스는 입니다. 범주 ID. 이 경우 Q2을 처리해야합니다.

위의 디자인이 우수합니까?

+0

AdminID 당 몇 개의 고유 카테고리가 있어야할까요? – scragar

답변

1

짧은 대답은 - 네, 괜찮습니다. 필요한 경우 인덱스를 만드는 것은 데이터의 사용이 보증하는 경우 "좋은 디자인"입니다.

길게 대답은 예입니다. 몇 가지 고려 사항이 있습니다.

테이블에있는 데이터의 양은 인덱스를 보장합니다. 즉, 각 인덱스에서 테이블의 모든 데이터를 추출하는 대신 여러 인덱스에서 데이터를 업데이트, 삽입 및 삭제하는 데 필요한 오버 헤드가 발생합니다.
기본적으로 - 예를 들어 테이블에 "많은 양의 데이터"가 포함되어 있지 않으면 전체적으로 인덱스를 피하는 것이 좋습니다.
또한 배포는 어떻게됩니까? 데이터의 80 % (예 : 숫자로만 표시)가 필드/열에서 동일한 값을 가지면 쿼리 최적화 프로그램이 기본적으로 대부분의 행을 처리해야하므로 오버 헤드가 발생하므로 인덱스가 선택 항목에 유용하지 않을 수 있습니다 인덱스를 유지하는 데있어 아마도 선택에서 얻은 이득보다 큽니다.

나머지 데이터베이스 디자인 (관련 테이블)을 모르더라도 구조가 "최적"인지 여부와 해당 테이블의 값이 실제로 필요한지 또는 다른 테이블에 있어야하는지 또는 쿼리 가능한 변경 될 수 있습니다.

1

일반적으로 (RDBMS 스펙을 무시하면) Products 테이블의 인덱스는 인덱스 열을 기준으로 Products 테이블의 정렬 된 데이터를 포함하는 다른 테이블이라고 간주 할 수 있습니다. searching the table based on the index column 일 때 효율적인 구조가됩니다.

반면에 인덱스를 사용하면 인덱스 동기화 비용 (인덱스 구조를 정렬해야 함)으로 인해 테이블에서 삽입, 업데이트 및 삭제 작업에 성능 저하가 발생합니다.

AdminIDCategoryID은, 인덱스가 삭제 또는 업데이트 또한 쿼리 성능을 도움이 될 것입니다 Category 또는 Admin(user) 테이블에 일어날 때 Products 테이블 잠금을 방지합니다 권장 그들 각각에 대한 인덱스를 가진 외국 키입니다.

AdminID + CategoryID에 복합 색인을 갖는 것은 트랜잭션 성능과 조회 성능 사이에서 트레이드 오프의 문제가됩니다. 그것은 좋은 이유를 찾기 위해 데이터베이스를 분석함으로써 멘토링을 필요로합니다.
MySql은 지정된 임계 값보다 실행 시간이 오래 걸리는 쿼리를 기록 할 수 있습니다.이 쿼리는 slow query log이고 long_query_time 매개 변수의 기본값은 10 초입니다.
느린 쿼리를 지정한 후에는 쿼리의 쿼리 실행 계획 (QEP)을 분석 한 다음 인덱스 생성 또는 제거를 결정해야합니다.

Know your data, know your queries, and MENTOR your indexes.

1

정확합니다. AdminID는 CategoryID를 다루기 때문에 (AdminID, CategoryID) 및 (CategoryId) 두 개의 색인 만 작성하면됩니다. OptimID가 비용 효율적이라고 판단 할 때 AdminID가 사용됩니다. 별도의 AdminID 인덱스를 만들 이유가 없습니다.

관련 문제