EXPLAIN 출력은 내 인덱스가 사용되지 않는다고 제안합니다.


9

done_status (done_status = INT)에서만 인덱스로 테이블을 설정했습니다.

여기에 이미지 설명을 입력하십시오

내가 사용할 때 :

EXPLAIN SELECT * FROM reminder  WHERE done_status=2

나는 이것을 다시 얻는다.

id select_type 테이블 유형 possible_keys key key_len 참조 행 추가
1 SIMPLE 알림 ALL done_status NULL NULL NULL 5 where 사용

그러나이 명령을 발행하면 :

EXPLAIN SELECT * FROM reminder  WHERE done_status=1

다음과 같은 결과가 나옵니다.

id select_type 테이블 유형 possible_keys key key_len 참조 행 추가
1 간단한 알림 ref done_status done_status 4 const 2   

EXPLAIN표시는 5 행을 사용하고 두 번째는 2 행을 사용한다는 것을 보여줍니다.

인덱스를 사용했다고 생각하지 않습니다. 처음으로 이해하면 3 행을 제공해야합니다. 내가 뭘 잘못 했니?

SHOW INDEX FROM reminder:

표 Non_unique Key_name Seq_in_index Column_name 데이터 정렬 카디널리티 하위 부분 팩형 Null Index_type 주석 Index_comment
알림 1 done_status 1 done_status 5 NULL NULL BTREE

확장 설명 :

id select_type 테이블 유형 possible_keys key key_len 참조 행 필터링 됨 추가
1 간단한 알림 ref done_status done_status 4 const 2 100.00

show warnings 관심있는 것을 보여주지 않았습니다.


색인이 작동한다고 믿어주세요. 그러나 나는 당신의 스크린 샷에서 쉽게 아무것도 볼 수 없습니다-당신은 "당신의 테이블에서 인덱스 표시"를 할 수 있습니까

그래 내 질문을 편집

스키마에
glorify

관심 밖으로 함께 반복 할 수있는이 실제 SQL mysql을 선택한다면 보여줄 것이다 "확장 설명"과 "쇼 경고"

@ajreal 영광은 무엇입니까?

답변:


4

'행'필드가 무엇인지 오해합니다. mysql이 쿼리를 충족시키기 위해 읽어야 할 것으로 예상되는 행 수입니다. 이 값은 매우 정확하지 않을 수 있습니다. 이것이 결과의 행 수 또는 mysql이 읽은 실제 행 수를 의미하지는 않습니다.


그래서? 내가 어디라고 했어? 옵티마이 저가 무엇을 선택해야합니까? 인덱스는 여전히 작동합니다.

@ajreal 인덱스가 깨 졌다는 의미는 아닙니다. 옵티마이 저만으로 데이터를 쿼리하는 가장 효율적인 방법을 선택합니다. OP가 EXPLAIN의 행 열이 정확해야한다고 가정했습니다. 인덱스가 깨 졌다는 의미는 아닙니다. mysql이 (아마도) 사용하지 않기로 결정한 것입니다.

1
@ajreal : 당신의 요점에 뭔가 빠졌습니다. Explain의 행 열은 인덱스와 관련이 없습니까? MySQL은 인덱스를 사용하지 않기로 결정합니다 (모든 데이터가 단일 페이지에있을 수 있습니다). 내가 당신의 요점을 이해하고 있는지 확실하지 않습니까? 5 행 테이블의 쿼리 최적화는 최적화 방법에 거의 영향을 미치지 않기 때문에 일부 '홀수'결과를 생성합니다.


이 경우 누가 옵티마이 저가 어떤 인덱스를 선택해야합니까? 옵티마이 저가 필요하지 않은 것처럼 느꼈기 때문에 인덱스 자체에는 아무런 문제가 없습니다. 무엇이 중요합니까?

3

첫 번째 실행 일반은 인덱스를 사용
하지 않으므로 인덱스의 information_schema.statistics가 일부 쓰기 작업 후 데이터를 따라 잡지 못하거나 테이블에 오랫동안 액세스하지 않았을 수 있습니다.

로 여기에 설명 : - MySQL의 쿼리 최적화 프로그램은 인덱스 통계를 읽을 않는 곳에서?

두 번째 실행 계획의 경우 information_schema.statistics가 이미 NULL 카디널리티 문제를 따라 잡고 수정하는 것 같습니다.

따라서 인덱스 최적화 프로그램에 따라 쿼리를 실행하십시오.

작은 행이있는 테이블의 경우 큰 문제가되지 않습니다.
그러나 데이터가 커지
므로 개발자는 항상이를 확인 하고 색인에서 카디널리티 발생이없는 경우 필요한 분석 테이블을 수행해야합니다.


0

첫 번째 실행 계획은 인덱스를 사용하지 않습니다.

에서 MySQL을 참조 웹 사이트 :

때때로 MySQL은 인덱스를 사용할 수 있어도 인덱스를 사용하지 않습니다. 이 상황이 발생하는 한 가지 상황은 옵티마이 저가 인덱스를 사용하기 위해 MySQL이 테이블의 많은 행에 액세스해야한다고 추정 할 때입니다. (이 경우에는 테이블 검색이 더 적은 탐색을 요구하기 때문에 훨씬 빠를 것입니다.) 그러나 이러한 쿼리가 LIMIT를 사용하여 일부 행만 검색하는 경우 MySQL은 어쨌든 더 빨리 찾을 수 있기 때문에 인덱스를 사용합니다. 결과에 반환 할 몇 개의 행

테이블에 5 개의 행만 있고 쿼리에서 3 개를 선택하면 MySQL 옵티마이 저는 전체 테이블을 스캔하는 것이 더 효율적이라고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.