2014-02-25 5 views
2

의 MySQL의 5.1.x의 my.cnf에서MySQL은 왜 인덱스가있을 때 느린 쿼리/로그 - 쿼리 - 사용하지 않는 인덱스로 로그인합니까?

:

log-queries-not-using-indexes = 1 
long_query_time = 30 
and slow queries are logged 

가 왜 로그에서이 보여? 느리게하지 않고 모든 필드를 색인화합니다. mysql.slow.log에서

:

# Query_time: 0.001492 Lock_time: 0.000031 Rows_sent: 229 Rows_examined: 458 
use database1; 
SET timestamp=1393342939; 
SELECT id,name FROM database1 ORDER BY name ASC; 

이 테이블은 229 개 행이, MYISAM.

id and name are indexed 
id = auto increment int unsigned 
name = varchar(255) utf-8 

왜 색인이 생성되지 않았거나 느린 쿼리 로그에서 이것을 표시 할 수 있습니까?

요약 및 자세한 내용 :

MyISAM 테이블, 229 행 이상의 열하지만 모든 ID와 이름 열이 필요한 229. 둘 다 색인을 가지고 있습니다. 쿼리에는 229 개의 행이 모두 표시되어야합니다.

내가 2 일 원하는 :
  • 1 :

    느린 쿼리에서 해당 쿼리를 표시하지 않음을/- 사용하지 않는-인덱스는 로그인합니다.
  • 2 : 가능한 빨리 쿼리하십시오.

감사합니다.

+1

"왜 인덱스가없는/느린 쿼리 로그에 표시합니까?"- 느린 쿼리 로그는 인덱스를 사용하지 않는 쿼리가 아니라 느리게 실행되는 쿼리에 대한 것입니다. 추신 : 주어진 쿼리 및 데이터 집합 크기에 대한 유용한 인덱스가 표시되지 않습니다. – zerkms

+0

쿼리 시간이 구성보다 3000 배 작습니다. 이건 이상해. –

답변

2

색인을 생성 할 WHERE 술어가 없기 때문에 테이블을 리터럴 풀 스캔하고 있습니다.

+0

이 쿼리에 추가 할 경우 : SELECT id, name FROM database1 WHERE id> 0 ORDER BY 이름 ASC; //이 로그에 없는가? 나는 그것을 시도 할 것입니다 ... 테이블에서 모든 데이터를 얻고 가장 빠른 방법은 무엇입니까? 데이터베이스에서 10 카운티 이름에서 10을 얻는 것처럼, 예를 들어 ... –

+1

아니요! 색인의 일반적인 개념은 주어진 조건의 양에 대한 모든 행을 평가할 필요없이 표의 서브 세트를 더 빨리 찾을 수 있어야한다는 것입니다. id> 0 인 경우 id가 항상 양수라고 가정하면 전체 스캔을 제공합니다 (개념적으로 테이블의 모든 레코드를 가져 오기 때문에). 이러한 쿼리에서 수행 할 수있는 최적화는 없으며 실행하는 데 1.5ms 미만의 시간이 소요될 수 있습니다. – dElo

+1

예를 들어 테이블에 100 개의 행이 있고 id = 1 인 행을 가져 오려는 경우 인덱스가 의미가 있습니다. 이 시점에서 id 필드를 만들고 인덱스해야하며 EXPLAIN PLAN은 인덱스의 사용법을 반영합니다. – dElo