2016-06-08 5 views
0

를 포함하지 않는 사용하면서 여기에 MySQL의에서 설명 명령의 출력 (이노) 인 '인덱스를 사용하여'말한다 :인덱스는 필수 필드

explain select * from multi_index_test_tbl_1 force index(`query_index_1`) where `text_field1`='0' order by `numeric_field2` desc limit 1000000; 
+----+-------------+------------------------+------+---------------+---------------+---------+-------+----------+--------------------------+ 
| id | select_type | table     | type | possible_keys | key   | key_len | ref | rows  | Extra     | 
+----+-------------+------------------------+------+---------------+---------------+---------+-------+----------+--------------------------+ 
| 1 | SIMPLE  | multi_index_test_tbl_1 | ref | query_index_1 | query_index_1 | 386  | const | 53547628 | Using where; Using index | 
+----+-------------+------------------------+------+---------------+---------------+---------+-------+----------+--------------------------+ 

테이블 multi_index_test_tbl_1의 스키마는 다음과 같다 :

CREATE TABLE IF NOT EXISTS `multi_index_test_tbl_1` 
(
    `text_field1` varchar(128) NOT NULL, 
    `numeric_field1` float NOT NULL, 
    `numeric_field2` float NOT NULL, 
    `text_field2` varchar(128) NOT NULL, 
    PRIMARY KEY (`text_field1`,`numeric_field1`,`text_field2`), 
    KEY `query_index_1` (`text_field1`,`numeric_field2`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

query_index_1이 사용 된 것으로 보입니다. 그리고 '에'인덱스 사용 중 '이 나타나고 query_index_1 인덱스에는 multi_index_test_tbl_1 테이블의 모든 필드가 포함되지 않습니다.

는 MySQL의 문서를 말한다 때문에 그 : 인덱스를 사용

(JSON 속성 : using_index)

열 정보를 추가 할 필요없이 인덱스 트리에있는 정보만을 사용하여 테이블 에서 검색 실제 행을 읽으려고합니다. 이 전략은 쿼리가 단일 인덱스의 일부인 열만 사용하는 경우에 사용할 수 있습니다.

여기 정확히 무슨 일이 일어나고 있는지 혼란 스럽습니다.

+0

@zerkms mysql doc은 '인덱스 사용'은 '인덱스의 정보 만 사용하여'검색된다는 의미입니다. – yeren1989

+0

왜 테이블 스키마를 표시하지 않습니까? 왜 인덱스를 강요하고 왜 "그 인덱스를 사용할 것인가"라고 궁금해합니다. – Drew

+0

@Drew 죄송합니다. 스키마를 추가했습니다. 그러나 질문은 : 공식 문서에 따르면, '인덱스 사용하기'는 인덱스가 사용되었음을 나타낼뿐만 아니라 실제 행 (따라서 클러스터 된 인덱스)이 사용되지 않는다는 것을 의미합니다. – yeren1989

답변

1

아, '필수 입력란이 포함되어 있습니다'. 정교하게 ...

InnoDB는 각 '보조'색인에 PRIMARY KEY의 모든 열을 포함합니다. 그래서,

KEY `query_index_1` (`text_field1`,`numeric_field2`) 

는 더 예에서

KEY `query_index_1` (`text_field1`,`numeric_field2`, 
        `numeric_field1`,`text_field2`) 

처럼 정말 그 모든 열을 포함합니다. 따라서 *을 포함하여 SELECT의 모든 항목이 해당 보조 색인에서 발견됩니다. 따라서 "인덱스 사용"은 '정확합니다'.

이것은 InnoDB가 때때로 MyISAM보다 나은 방법 중 하나입니다.

자세한 내용을 보려면 EXPLAIN FORMAT=JSON SELECT ...을 시도하십시오.

+0

답변입니다! 몇 가지 테스트 테이블에서 실험으로 확인했습니다. – yeren1989