2009-10-22 9 views
0

검색어 :이 쿼리를 최적화하는 방법은 무엇입니까?

select id, 
     title 
    from posts 
where id in (23,24,60,19,21,32,43,49,9,11,17,34,37,39,46,5 
2,55) 

이 계획을 설명해

mysql> explain select id,title from posts where id in (23,24,60,19,21,32,43,49,9,11,17,34,37,39,46,5 
2,55); 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 
| 1 | SIMPLE  | posts | ALL | PRIMARY  | NULL | NULL | NULL | 30 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 
1 row in set (0.05 sec) 

ID는 게시물 테이블의 기본 키입니다. 다른 인덱스를 추가 이외

+0

기본 키의 명시 적 값을 선택하고 EXPLAIN이 다른 결과 (예 : 18 행 대신 30 행)를 예상한다는 사실은 아마도 optimzer가 상호 작용하는 방식 때문일 것이라고 생각합니다. 통계와. 아니면 내가 당신의 질문을 오해 했습니까? – davek

+0

@Dave K 30 여기에서 쿼리를 처리하기 위해 MySQL이 읽어야하는 행 수는 결과 목록에서 예상되는 행 수가 아닙니다. 적은 수의 행 (모든 노드가 하나의 노드에 포함되거나 모든 비율이 포함될 수 있음) 만 필요하기 때문에 "검색"보다는 "검색"하는 것이 더 효율적입니다. – mjv

+0

단일 ID를 검색하는 경우 계획 바보는 무엇을 좋아합니까? – Thorsten

답변

3

같은

  • 클러스터 인덱스 ID와
  • ID [제] 및

가 보이는 SELECT 절에서 다른 항목을 포함하는 포함 인덱스 할 일이 거의 없다 ...

실제로 이러한 인덱스가 있더라도 MySQL은 테이블 스캔을 수행하기로 결정할 수 있습니다.이 여기에 해당됩니다 ("ALL"유형). 그 이유는 일 수 있습니다. 테이블에 상대적으로 적은 수의 행 (쿼리에서 반환 할 것으로 예상되는 행 수와 비교)이 일 수 있습니다. 따라서 테이블을 순차적으로 읽는 것이 더 효율적입니다. 인덱스 간접 지정 (index indirection)을 사용하여 "모든 곳에서 바라고"하는 것이 아닙니다.

0

아무런 문제가 없습니다. 목록에 대해 선택해야하는 경우 "IN"이 올바른 방법입니다. 당신은 불필요한 정보를 선택하지 않고 있으며, 당신이 선택하고있는 것은 색인 된 키일 것입니다.

관련 문제