2013-08-13 4 views
0

내 쿼리 및 설명 출력은 다음과 같습니다.전체 키를 사용하지 않는 이유는 무엇입니까?

describe ENSEMBL_DERIVED 
-------------- 

+-------------------+------------------+------+-----+---------+-------+ 
| Field    | Type    | Null | Key | Default | Extra | 
+-------------------+------------------+------+-----+---------+-------+ 
| SEQ_REGION_ID  | int(10) unsigned | NO | PRI | 0  |  | 
| SEQ_REGION_START | int(10) unsigned | NO | PRI | 0  |  | 
| SEQ_REGION_END | int(10) unsigned | NO | PRI | 0  |  | 
| SEQ_REGION_STRAND | tinyint(2)  | YES |  | NULL |  | 
| STABLE_ID   | varchar(128)  | YES |  | NULL |  | 
| DISPLAY_LABEL  | varchar(128)  | YES | MUL | NULL |  | 
+-------------------+------------------+------+-----+---------+-------+ 

있는 key_len 필드 설명 문에 기본 키의 2 3 중 열이 사용되고 있음을 나타냅니다 :

explain select * from ENSEMBL_DERIVED where 
SEQ_REGION_ID=27523 AND SEQ_REGION_START >= 12595527 AND SEQ_REGION_END <= 43811979 
-------------- 

*************************** 1. row *************************** 
      id: 1 
    select_type: SIMPLE 
     table: ENSEMBL_DERIVED 
     type: range 
possible_keys: PRIMARY 
      key: PRIMARY 
     key_len: 8 
      ref: NULL 
     rows: 2004 
     Extra: Using where 
1 row in set (0.00 sec) 

그리고 여기에 테이블입니다. 왜 이런거야? > = 및 < = 연산자가 두 개의 서로 다른 열에있는 증상입니까?

쿼리 + 테이블을 최적화하는 방법이 있습니까? 제 생각에 "2004 행의 어디에서 사용하는 것이 이상적이지 않을 수 있습니다.

+0

도 제공 할 수 있습니다. SHOW CREATE TABLE ENSEMBL_DERIVED; please – fabien

+0

이 쿼리는 느리게 실행됩니까? – Namphibian

답변

4

쿼리가 제공된 경우 해당 인덱스의 처음 두 열만 "범위 검색"에 사용할 수 있습니다. 세 x 째 컬럼의 술어는 동일한 범위 스 5에서 만족 될 수 없습니다. 엔진이 검사해야 할 행 수를 줄이는 방법은 없습니다. 세 번째 열의 조건부 검사는 범위 검사와 일치하는 모든 행에서 수행됩니다.

"Using where"은 EXPLAIN 출력에서 ​​기대하는 것입니다. 뭔가 다른 걸 기대 했니?

일부 추가 지식을 추가 할 수있는 도메인 지식이없는 한 쿼리를 최적화 할 방법이 없습니다. 쿼리가 테이블의 모든 열을 반환하기 때문에 기본 키는 이미 커버 인덱스입니다. (이 InnoDB인가 MyISAM인가)

테이블이 조각난 (많은 삽입, 갱신, 삭제 등) 경우, OPTIMIZE TABLE는 체크 할 필요가있는 블록 수를 줄이지 만, 차이를 많이 낸다.

관련 문제