2016-11-25 1 views
0

내 서버의 쿼리가 인덱스를 사용하고 있는지 확인하고 싶었습니다. 그래서 log_queries_not_using_indexes을 사용하고 테스트 케이스를 실행했습니다.MySQL log_queries_not_using_indexes 동작 이해

다음과 같은 쿼리가 mysql.slow_log 테이블에 쓰여 있음을 알게되었습니다.

SELECT * FROM user_rel 
WHERE (f = '5837be9dc34f747dbd7ba6c7' AND t = '5837be9dc34f747dbd7ba6ca') 
OR (f = '5837be9dc34f747dbd7ba6ca' AND t = '5837be9dc34f747dbd7ba6c7') 
LIMIT 2; 

하지만 내 EXPLAIN EXTENDED 결과는 좋아 보인다.

# id, select_type, table, type, possible_keys, key, key_len, ref, rows, filtered, Extra 
'1', 'SIMPLE', 'user_rel', 'range', 'f-t-UNIQUE,t_uid_idx', 'f-t-UNIQUE', '208', NULL, '2', '100.00', 'Using index condition' 

왜이 쿼리가 slow_log으로 작성되었는지 설명해주십시오. 여기


편집 한

느린 쿼리 로그에 대한 MySQL의 옵션입니다.

log_output TABLE 
log_queries_not_using_indexes ON 
long_query_time 2.000000 
min_examined_row_limit 0 
slow_query_log ON 
sql_log_off OFF 

편집 내가 10min_examined_row_limit를 업데이트 한 후 2

, 쿼리가 더 이상 표시되지 않습니다. 그러나 이것이 왜 log_queries_not_using_indexes 결과에 영향을 미칩니 까?

답변

0

흠 ... 피하는 또 다른 이유가 있습니다. log_queries_not_using_indexes.

만약 ft는 대칭 : 당신이 그들을 저장하기 전에 두 개의 열을 '분류'하는 경우

표는보다 효율적으로 조회 할 것이다. OR을 수행 할 필요가 없으며 분명한 색인을보다 효율적으로 사용할 수 있습니다.

+0

따라서 고유 한'f','t' 쌍에 대해 하나의 행만 유지하는 것이 좋습니다. 나는 당신이 제안한 것처럼 리팩터링하려고 노력할 것이다. 고맙습니다. – redism