2012-06-26 2 views
2

테이블에있는 값이 20 개 밖에되지 않는 table_name 필드가 있습니다. 테이블의 총 레코드 수는 약 수만 행입니다. 다음과 같은 쿼리를 수행하는 경우 :고정 값이 거의 없지만 값이 전체 열의 25 % 미만인 열의 인덱싱

반환되는 레코드의 합계는 전체 행의 25 %입니다. 대부분 전체 레코드의 10 % 만 얻습니다. 여기에 table_name 필드를 인덱싱 할 수있는 범위가 있습니까? 인덱스가 제대로 작동하려면 해당 필드의 값이 고유하거나 가까운 값이어야합니다. 내 경우 엔 독특하지 않습니다. 그러나 반환 된 행 수가 전체 행 수에 비해 적다면 인덱싱에 적합한 경우라고 들었습니다.

어떻게해야합니까? 관통 읽어 순차적 -

전체 테이블을 스캔 :

+0

예 해당 열을 색인 할 수 있습니다. –

+0

@SashiKant 감사합니다. lil '자세한 내용을 게시 할 수 있습니까? 그것은 나중에 ppl 도움이 될 것입니다 .. – nawfal

+0

@ N.B. 우수한. 색인 생성에 대한 잘못된 이해를 명확히합니다. 답변으로 게시 할 수 있습니까? – nawfal

답변

3

가 인덱스를 사용하는 이점을 얻을 고유하지 않아도 없음 그러나 쿼리를 처리 할 때 DBMS가하는 일에 대해 생각하는 시간이 좀 걸릴 없다 데이터 (즉, 검색 작업이 거의 없음)

색인 조회 - 색인에서 조회를 선택하여 선택한 데이터의 시작을 찾은 다음 기본 테이블의 행을 식별하기위한 순차 읽기 (몇 개 탐색)를 수행 한 후 많은 양 테이블에서 행을 가져 오려고합니다.

검색은 비쌉니다.

(캐시에서 최신 데이터를 플러시하는 경향이 더 커지므로 전체 테이블 스캔의 2 차 효과가 있지만 우선 주 관심사를 다루어야합니다.)

이 경우 인덱스가있는 경우 DBMS가 사용하지 않을 가능성이 있으며, 그렇다고하더라도 전체 테이블 스캔보다 느릴 수 있습니다. 경험적으로 보면, 술어가 행의 약 5 % 미만을 식별하는 경우에만 색인에서 이점을 얻을 수 있습니다 (그러나 색인 및 자료의 상대 크기에 따라 달라질 것입니다)).

즉,이 필드에만 색인을 추가하면 안됩니다.

많은 행을 반환하는 쿼리를 실행해야하는 이유에 대해 생각하면 도움이 될 것 같습니까?

+0

왜 이런 생각이 다른가요? – symcbean

+0

카디널리티 ='COUNT (DISTINCT (field))/COUNT (*)'에 대한 내 자신의 설명을 반복하므로 카디널리티가 높아질수록 색인 생성이 향상됩니다. selectivity ='COUNT (*) WHERE field = 'xyz'/ COUNT (*)'. 선택성을 낮추면 색인 생성이 향상됩니다.내 질문은 내가 의존해야하는 것입니다. 다른 경우는 선택률이 좋기 때문에 (최대 약 25 %) 카디널리티가 너무 가난하기 때문에 (20/10000은 약 0.002입니다.) – nawfal

+0

거의 카디널리티가 높을수록 선택도가 높아져서 옵티마이 저가 인덱스를 선택하지만 데이터가 매우 비뚤어진다면 인덱스를 사용하는 '필드'의 일부 값은 전체 테이블 스캔보다 더 효과적 일 수 있지만 힌트를 추가해야합니다. 그러나 옵티마이 저는 선택성에 대해 아무것도 모릅니다. 술어의 리터럴 값을 무시합니다. "대부분 전체 레코드의 10 % 만 얻는다."- 인덱스가 더 빨라지는 이슬이 없다는 의미입니다. – symcbean

1

수정 된 답변

방금 ​​색인을 작성한다고해서 MySQL이이를 사용한다는 의미는 아닙니다. 이를 염두에두고 필자는 대답을 다시 표현할 것입니다 :

(일반 또는 귀하 자신의) 관행에 따라 해당 열에 색인을 만들어야합니다. MySQL은 경험적 방법을 사용합니다. 여기에는 사용 가능한 인덱스와 해당 카디널리티를보고 사용할 인덱스를 결정하거나 인덱스를 전혀 사용하지 않는 것이 포함됩니다.

이 주제에 대한 흥미로운 내용은 here입니다.

+0

나는이 의심 스러움을 가지고있다.이 블로그 http://www.mysqlperformanceblog.com/2007/08/28/do-you-always-need-index-on-where-column/ 그리고 많은 비슷한 말로 그것이 얼마나 많은 행에 달려 있다고 말한다. where 절이 양보 할 수 있습니다. 그러나 일부는 쿼리에서 반환 된 레코드가 전혀 중요하지 않으며 카디널리티 문제 만 고려해야한다고 말합니다. 내 질문은 반환 된 행에 종속적 인 색인을 생성하는 것입니까 아니면 카디널리티에만 의존하는 것입니까 (= 필드에 여러 고유 값이 있습니까?)? – nawfal

+0

인덱싱은 카디널리티에 따라 성능을 산출합니다. 1에 가까울수록 좋습니다. 그게 전부 야. 10 개의 가능한 값, db = cardinality *에서 10 개의 행은 1이 될 수 있습니다. 30k 행을 추가하면 카디널리티가 10/30k가됩니다. "rows returned"와는 아무런 관련이 없습니다. –

+0

@ N.B. 그게 전부지만, 당신이 말하는,하지만 링크가 아니라. 이 링크 http://www.mysqlperformanceblog.com/2007/08/28/do-you-always-need-index-on-where-column/ 또는 http://www.mysqlperformanceblog.com/2006/06을 참조하십시오./02/indexes-in-mysql/ – nawfal

관련 문제