2009-05-07 2 views
1

나는 2.4M + 행과 인덱스가없는 테이블을 가지고있다. 모든 행에 고유 한 1 열 (우리는 id이라고 부름)을 100 % 확신합니다. 유형은 VARCHAR(255)입니다.IN (...)을 사용하여 MySQL 테이블에 무작위로 액세스하는 가장 효율적인 방법은 무엇입니까?

이제 파일이 약 10,000 id이고 각 행을 모두 가져와야합니다.

IN(...)을 사용하는 것이 가장 좋습니다. 색인을 추가해야합니까?

SELECT * FROM archive_table WHERE id IN('id1', 'id2', ... 'idn'); 

이 효과적으로 보관 된 데이터를 단 몇 주마다 나 액세스 :

I는 다음과 같이 몇 가지 생각에 대해 생각했다.


시스템 : 5.0.45 MySQL의 테이블 :의 MyISAM

+0

즉시 정수 ID 열을 가져 와서 색인을 생성하십시오. 나는 너에게 간청한다. – Eric

답변

0

예, 두 테이블 (2.4mil 및 10,000)에 인덱스를 추가하십시오.

transaction_table이 10,000 개의 행으로 가정하면 archive_table은 2입니다.조인 더 읽을 수 및 조인과 같은 성능을 통해이 EXISTS 절 사용

SELECT id 
    FROM transaction_table a 
WHERE EXISTS(SELECT * 
       FROM archive_table b 
       WHERE a.id = b.id) 

: 4 밀 행과 당신은 당신이 코드 수 archive_table overr 인덱스를 구축했습니다.

0

지옥 예는 인덱스를 추가해야합니다. 그러나 id가 "기본 키"인 경우에는 이미 색인입니다.

2

ID 열에 색인을 추가하고 (선택적으로) UNIQUE로 정의하십시오. 인덱스가 정렬 된 순서로 ID를 포함하기 때문에 MySQL이 원하는 행을 빨리 찾을 수 있습니다. 당신의 테이블이 분류 되더라도, e. 지. 증가하는 ID 순서로 삽입하기 때문에, MySQL은이를 알지 못하며 항상 전체 테이블 스캔을 수행하여 쿼리에 맞는 레코드를 찾습니다.

반면 색인을 사용하면 검색이 서버에서 매우 쉬워집니다. 한 번에 정말 많은 행 (매우 긴 IN() 절)을 요구할 때만 옵티마이 저는 데이터의 약 30 % 이상을 원한다고 결정할 수 있습니다.이 경우 선형 스캔으로 다시 폴백합니다. 과도한 디스크 검색을 방지합니다. 이 긴 상태 : 지옥이 될 것입니다 몇 백만 행 그러나

I 좋겠 또한 열이 정말 255 자 할 경우 재검토하는 것은 추천 - VARCHAR가 많은 공간 때 사용하지 않을지라도 당신은 필요하지 않습니다, 그것은 의심스러운 디자인처럼 들립니다. 숫자 필드 여야하는지 여부는 필요에 따라 다르지만 일반적으로 권장됩니다.

+0

'id'열은 가변 길이의 영숫자 문자열이지만 255 자 근처에 아무 것도 없습니다. – rjstelling

3

원하는 파일이 있으므로 작업 테이블로 가져온 다음 테이블을 프로덕션 테이블에 조인하여 원하는 결과를 얻는 것이 좋습니다. 물론,하기 전에 인덱스 전략을 구현해야합니다.

0

과거의 DBA에서 내가 이해 한 것으로부터, "IN"절에는 대괄호 안에 얼마나 많은 명시적인 ID를 지정할 수 있는지에 대한 제한이 있습니다. SELECT를 사용하여 IN 목록을 제공 할 수있는 경우에는 적용되지 않는다고 알려졌습니다.

HLGEM이 테이블에 조인을 가져 와서 사용하는 것이 가장 쉬운 방법 일 것입니다. 앞서 언급했듯이 색인을 생성하면 성능이 향상됩니다.

관련 문제