2017-05-11 8 views
1

나는 수백만 개의 레코드가있는 테이블을 가지고 있습니다.두 개의 고유 한 값만있는 열에 인덱스 만들기

하나의 열에 '0'과 '1'값만 있습니다.

필자는 열 값이 '0'인 레코드에 대해서만 염려하고 이러한 레코드를 처리하지 않습니다.

값이 '0'인 레코드의 수를 고려하면 수백 개가 될 것이므로 해당 열에 인덱스를 만드는 것이 현명합니다.

이후 인덱스는 실제 레코드에 대한 수백 개의 refrences를 갖는 2 개의 값 '0'과 그에 상응하는 수백만 개의 레코드에 대한 참조를 갖는 '1'을 갖게됩니다.

내가 '1'과 그 참조를 신경 쓰지 않기 때문에 처음부터 색인을 사용해야합니까?

+2

어떤 RDMS를 사용하고 있습니까? SQL 서버에서 필터링 된 인덱스를 사용할 수 있습니다. – Kevin

답변

1

소프트웨어 엔지니어링을 비롯한 엔지니어링 분야에서는 추측하는 대신 결과를 측정해야합니다 (또는 인터넷 사용자에게 올바른 일을 말하도록 요청하는 것).

검색 할 값이 주어지면 EXPLAIN을 사용하여 SQL 데이터베이스가 다른 쿼리를 최적화하는 방법을 찾아야합니다.

0이있는 행과 1이있는 행의 불균형 수가 같기 때문에 데이터베이스가 하나 또는 다른 값을 검색하는 쿼리를 최적화하는 방법에 큰 차이가있을 것입니다.

어쨌든 행의 99 %를 방문한다고 가정 할 때 색인을 읽는 오버 헤드가 1 일 경우 낭비가 될 수 있습니다. 그래서 좋은 옵티마이 저는 인덱스를 건너 뛰고 일치하지 않는 행의 소수만을 버리고 테이블을 직접 읽어야합니다.

그러나 소수 값 0을 검색하면 옵티마이 저는 인덱스를 사용하면 유익하다는 것을 알 수 있습니다.

EXPLAIN을 사용하여이를 확인하십시오. EXPLAIN을 사용하여 두 가지 쿼리 (0을 검색하고 1을 검색)를 시도하고 옵티마이 저의 계획에서 차이점을 확인하십시오.

사용중인 SQL 데이터베이스의 브랜드에 대해 구체적이지 않기로 결정했기 때문에 EXPLAIN의 구문이 모호합니다. "sql"및 "database-indexes"는 질문 만했지만 "sql-server"또는 "mysql"또는 "postgresql"또는 사용중인 모든 것을 태그하지 않았습니다.

EXPLAIN은 표준 SQL 언어의 일부가 아니므로 각 데이터베이스는 EXPLAIN을 약간 다르게 구현합니다. 특정 답변은 사용하는 SQL 데이터베이스에 따라 다릅니다.