2013-07-17 3 views
6

mySQL 테이블을 정렬하면 인덱스가 사용되지 않고 이유를 알 수 없습니다.인덱스를 사용하지 않는 매우 간단한 mysql 쿼리

CREATE TABLE IF NOT EXISTS `test` (
    `a` int(11) NOT NULL, 
    `b` int(11) NOT NULL, 
    KEY `kk` (`a`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

을이 :

내가있어

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE  test ALL NULL   NULL NULL NULL 10009 Using filesort 

EXPLAIN SELECT * 
FROM test 
USE INDEX (kk) 
ORDER BY a 

뿐만 아니라

EXPLAIN SELECT * 
FROM test 
ORDER BY a 

나에게이 있습니다

이 파일을보고 싶지 않고 kk 키를 사용하여 테이블을 정렬하고 싶습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?


내 소식을 보내 주셔서 감사합니다. 그러나 이제는 "테이블 스캔"과 "파일 정렬"이 의미하는 바가 무엇인지 알지 못합니까? 모든 필드와 테이블의 모든 행을 선택하는 경우에도 해당 열의 인덱스 내부 트리를 O (n)로 이동하여 테이블을 한 열 정렬하는 것이 더 빠르지 않습니까? 각 행에 대해 O (1)에서 요청 된 여분의 열을 파일로 만드십시오.>> 인덱스 파일은 테이블 파일에 각 행의 물리적 위치를 저장합니까? O (n * log n)에서 색인을 건드리지 않고 테이블 파일에 (잠재적으로) 임의로 저장된 행을 빠른 정렬로? 나는 MySQL에서 색인이 어떻게 작동하는지에 대한 나의 이해가 잘못되었다고 생각합니다. 전체 검사를 사용하는 것이 더 효율적으로 MySQL의 추정 -

답변

11
  1. 당신은 당신은 내가 위에서 말한 후 모든 열

을 선택하고

  • 모든 행을 선택하고 있습니다.

    이 인덱스를 사용하려면 당신은 행의 적절한 수에 제한 할 일부 WHERE를 추가 할 필요가 반환 (예를 들어 50)

  • +0

    1)에서 "모든 행"을 의미합니까? –

    +0

    @a_horse_with_no_name : 아마도 "전체 테이블"(또는 "모든 행")을 의미했을 것입니다. 올바른 방법으로 영어로 표현하는 방법을 모릅니다. – zerkms

    +1

    예, "전체 테이블"또는 "모든 행"이 더 좋을 것이라고 생각합니다. –

    0

    부터 당신이 어떤 WHERE 절 그것이 filesort (테이블 스캔을) 할 것입니다하지 않는 한 선택한 항목 만 색인에서 가져옵니다. 이 쿼리는 인덱스를 사용합니다. 인덱스의 열을하지 선택 (* 또는 b)이 파일 스캔을 할 것입니다 경우이 SQL Fiddle

    EXPLAIN SELECT a FROM test ORDER BY a 
    

    를 참조하십시오. 커버링 인덱스가있는 where 절을 추가하거나 선택중인 컬럼을 변경하십시오.

    2

    @zerkms가 맞다면, 테이블의 모든 행을 읽음으로써 MySQL은 테이블의 대부분을 읽어야하므로 인덱스를 읽을 필요가 없다고 결정합니다. 테이블의 서브 세트를 선택하면 옵티마이 저가 작동을 변경합니다.

    예를 들어 나는 너와 같은 테이블을 만들고 0에서 1000000 사이의 임의의 정수로 16384 개의 행을 채 웠습니다. 그런 다음 테이블의 첫 번째 15 %, 다른 17 %의 테이블에 대해 EXPLAIN을 시도했습니다. 다음 19 %.

    mysql> EXPLAIN SELECT * FROM test where a < 150000 ORDER BY a; 
    +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
    +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
    | 1 | SIMPLE  | test | range | kk   | kk | 5  | NULL | 2272 | Using where | 
    +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
    
    mysql> EXPLAIN SELECT * FROM test where a < 170000 ORDER BY a; 
    +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
    +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
    | 1 | SIMPLE  | test | range | kk   | kk | 5  | NULL | 2560 | Using where | 
    +----+-------------+-------+-------+---------------+------+---------+------+------+-------------+ 
    
    mysql> EXPLAIN SELECT * FROM test where a < 190000 ORDER BY a; 
    +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+ 
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra      | 
    +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+ 
    | 1 | SIMPLE  | test | ALL | kk   | NULL | NULL | NULL | 16384 | Using where; Using filesort | 
    +----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+ 
    

    색인의 열을 선택하기 전까지는 색인을 사용하도록 설득 할 수 있습니다. 독자적으로 색인을 읽고 테이블을 만지지 않기로 결정할 것입니다. 필요한 경우 추가 열이있는 색인을 정의 할 수 있습니다. 열을 검색하거나 정렬하지 않아도 색인을 정의 할 수 있습니다.

    mysql> ALTER TABLE test ADD KEY kk2 (a,b); 
    mysql> EXPLAIN SELECT a,b FROM test ORDER BY a; 
    +----+-------------+-------+-------+---------------+------+---------+------+-------+-------------+ 
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
    +----+-------------+-------+-------+---------------+------+---------+------+-------+-------------+ 
    | 1 | SIMPLE  | test | index | NULL   | kk2 | 10  | NULL | 16384 | Using index | 
    +----+-------------+-------+-------+---------------+------+---------+------+-------+-------------+ 
    
    관련 문제