2014-01-17 2 views
0

나는 다음과 같은 쿼리가 :MySQL이 FULLTEXT 인덱스를 사용하지 않는 이유는 무엇입니까?

EXPLAIN SELECT * 
FROM glean2_saves 
WHERE username = '1d85d5aed8b02b3d6b0c155a563293ef' 
AND ses_id = 'e4fa3ae216f5033fbd16d6c66370954c' 
AND save_status =1 
ORDER BY id DESC 

을 그리고 그 결과는 이것이다 : 나는 오른쪽 컬럼에 인덱스가 할

Action Keyname Type Unique Packed Column Cardinality Collation Null Comment 
Edit Edit Drop Drop PRIMARY BTREE Yes No id 331837 A  
Edit Edit Drop Drop save_status BTREE No No save_status 3 A YES 
Edit Edit Drop Drop nickname FULLTEXT No No nickname 7374  YES 
Edit Edit Drop Drop username FULLTEXT No No username 7717  YES 
Edit Edit Drop Drop ses_id FULLTEXT No No ses_id 11442  YES 

, : 여기

id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE glean2_saves ref save_status,username,ses_id save_status 2 const 286315 Using where; Using filesort 

내 인덱스입니다 하지만 왜 그들은 사용되지 않습니다
? save_status

인덱스가 없으면 쿼리가 너무 길거나 때로는 15 초가 걸리기 때문에 "save_status, username, ses_id"는 "가능한 키"(save_status, username, ses_id)에 있습니다. 그것은 1 초보다 적게 걸릴 것입니다. 데이터베이스는 330,000 개가 넘습니다.

+0

참고로이 제목은 잘못되었습니다. "전체 텍스트"색인은 텍스트 검색에 사용되는 색인을 나타냅니다. 이 질문은 문자 열에 대한 일반 색인에 관한 것입니다. –

답변

2

이 쿼리의 경우 whereorder by 절을 포함하는 인덱스가 필요합니다. 해당 색인은 다음과 같습니다.

glean2_saves(username, ses_id, save_status, id) 

평등 비교를 수행 중이므로 처음 세 열의 순서는 임의입니다. 그러나 마지막 열은 order by의 경우 id이어야합니다.

에 대한 이유는입니다. MySQL은 개별 색인을 사용하고 있지 않습니다. where 절에 대한 인덱스 병합이 많은 작업이라고 말하면 하나의 인덱스를 스캔하고 나머지 열에 대한 테스트를 수행하는 것보다 많은 작업이 필요할 수 있습니다.

+0

굉장! 그것은 매력처럼 작동합니다! 정말 고맙습니다! – nastaseion

관련 문제