2017-04-21 1 views
0

색인 열 'unique_identifier'가 있습니다. 인덱스 열을 사용하여 데이터를 가져올 때 인덱스를 사용하여 가져 오지 않습니다.varchar의 인덱스 열이 작동하지 않습니다.

mysql> show index from stock_index_table; 
    +-------------------+------------+-------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
    | Table    | Non_unique | Key_name   | Seq_in_index | Column_name  | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | 
    +-------------------+------------+-------------------+--------------+-------------------+-----------+-------------+----------+--------+------+------------+---------+---------------+ 
    | stock_index_table |   0 | PRIMARY   |   1 | id    | A   |  4393 |  NULL | NULL |  | BTREE  |   |    | 
    | stock_index_table |   1 | unique_identifier |   1 | unique_identifier | A   |  4393 |  NULL | NULL |  | BTREE  |   |    | 

'설명 확장'을 사용하여 선택하면 '색인 사용'대신 '어디에서 사용 하시겠습니까?'가 표시됩니다. 데이터가 인덱스 열을 사용하여 가져 오지 않는다는 의미입니까? 다음은 select query에 대한 'explain extended'의 결과입니다.

mysql> explain extended select id 
     from stock_index_table 
     where unique_identifier='Nifty' ; 
    +----+-------------+-------------------+------+-------------------+-------------------+---------+-------+------+----------+--------------------------+ 
    | id | select_type | table    | type | possible_keys  | key    | key_len | ref | rows | filtered | Extra     | 
    +----+-------------+-------------------+------+-------------------+-------------------+---------+-------+------+----------+--------------------------+ 
    | 1 | SIMPLE  | stock_index_table | ref | unique_identifier | unique_identifier | 52  | const | 1 | 100.00 | Using where; Using index | 
    +----+-------------+-------------------+------+-------------------+-------------------+---------+-------+------+----------+--------------------------+ 

'설명'에 대한 결과는 추가로 다음과 같아야합니다.

+--------------------------+ 
    | Extra     | 
    +--------------------------+ 
    | Using index    | 
    +--------------------------+ 
+0

당신이 도움이 읽을 찾을 수 있습니다 : http://meta.stackoverflow.com/a/271056/ –

+0

실제 ** 문제는 ** 있나요 아니면 당신이되지 않고 있음 인덱스를 귀찮게하는 것이 바로 그 것이다 익숙한? 쿼리가 느려 집니까? – Mjh

+0

'SHOW CREATE TABLE'을 제공해주세요. –

답변

1

고유하지 않은 색인 "unique ..."을 사용하여 혼동하지 마십시오.

EXPLAIN이 가장 적합합니다.

는 ("커버"를 의미하는) "인덱스를 사용하는 것은"오직 인덱스가 필요하다고 말한다. 당신은

PRIMARY KEY(id), 
INDEX(unique_identifier) 

을 가지고 있고 당신은 이노를 사용하는 것으로을 표시 . 이것은 (InnoDB에서) 인덱스가 실제로 (unique_identifier, id)이라는 것을 의미하며, PK는 아무런 2 차 인덱스에도 추가되지 않습니다.

쿼리는 두 개의 열만 필요하므로 "덮음"입니다. 열 번 이상 나타나지 간주되므로

, 그것은 "REF"및 "사용"할 필요가있다. "행 = 1"은 통계가 열이 고유 한 값에 가깝다는 것을 추론했기 때문에 간단합니다.

  • 는 "간지"의 발생을 찾을 인덱스에 대해 B + 트리 드릴 다운 할 실행이
  • 스캔 전후 (이것은 B + 트리 이노 사용에 효율적) "Nifty"가 아닌 항목을 찾을 때까지.

그래서, 인덱스에 하나 추가 '행'을 터치합니다. UNIQUE이면 미리 스캔 할 필요가 없습니다.

2

데이터를 가져 오는 방법은 쿼리 최적화 프로그램에 달려 있습니다. 쿼리가 적합하지 않을 수도 있습니다. 테이블과 쿼리를보고 뭔가 다른 것이 있는지 확인해야합니다.

관련 문제