2014-07-12 2 views
1

MySQL에서 큰 SELECT WHERE IN 쿼리를 수행해야하며 신속하게 실행해야합니다. varchar 127에 기본 키가있는 1 억 개가 넘는 행이있는 테이블이 있습니다 (그럴 수 있어야합니다).큰 MySQL을 최적화 WHERE IN 문을

$ in에 5000 개의 값이있는 SELECT col1 FROM 테이블 WHERE col1 IN ($ in)을 수행합니다. 필자는 본질적으로 기본 키 col1의 테이블에있는 5,000 개의 값 중 하나를 찾아야합니다.

일반적으로 쿼리는 1 ~ 10 초가 걸리지 만 대개 약 7 ~ 8 초입니다.

varchar로 인덱싱 된 거대한 테이블에서 큰 IN 절을 사용하여 SELECTS를보다 빠르고 최적으로 수행 할 수 있습니까?

PHP와 PDO가있는 전용 서버에서 InnoDB를 사용하고 있습니다. 제안 해줘서 고마워.

+1

'$ IN' 변수의 값을 기본 테이블에 임시 테이블로 넣으려고 했습니까? 이 테이블에 조인을하면 성능이 향상 될 수 있습니다. 또한 반환되는 행 수는 얼마입니까? 결과 집합이 꽤 큰 경우 결과 집합을 생성하는 대신 데이터를 검색하는 데 시간이 소요될 수 있습니다. –

+0

값이 임의입니까? 다른 말로하면 WHERE 및 value Mihai

+0

Gordon에서 값을 추가 할 수 있습니다. 시도하지 않았으므로 상대적으로 새로운 단계이기 때문에 단계가 필요합니다. 큰 MySQL 테이블. 5,000 명 중, 일반적으로 1,000 명에서 5,000 명 정도가 반환되며, 꽤 큰 반환 세트입니다. – Guy

답변

0

의견이 약간 있습니다.

나는 이미 table(col1)에 대한 색인을 가지고 있다고 생각합니다. 그렇지 않으면 쿼리에 10 초 이상 걸릴 것입니다. 이것이 사실이 아니라면, 컬럼을 추가하십시오. 더 나은 방법으로, 열을 기본 키로 만듭니다.

색인이 메모리에 맞지 않는다는 의혹이 있습니다. 이를 위해서는 MySQL DBA를 찾아야합니다. MySQL DBA는 큰 테이블을 가지고 있어야하며, MySQL의 메모리 옵션에 대해 알아야합니다. 메모리에 적합하지 않은 색인은 이러한 유형의 동작을 나타냅니다.

이것이 사실이라면 동작은 매우 선형 적이어야합니다. 따라서 500 개의 ID 목록이있는 경우 약 1 초 또는 약간 더 소요됩니다. 50 개의 ID가 있으면 1/10 초 정도됩니다.

이 경우 ID 목록을 정렬하면 도움이 될 수 있습니다. 그러나, 그것은 정말로 내 부분에 대한 추측이다.

+0

예 테이블의 기본 키를 언급해야합니다. 인덱스가 메모리에 맞지 않을 수도 있습니다. 그렇다면 그 방법이 있는지 확인하는 방법이 있습니까? mysql을위한 메모리 옵션에 대해 배울 곳은? 그리고 마지막으로, 테이블의 ID는 사전 순으로 정렬되지만 IN 절은 그렇지 않습니다 - 당신이 제안하는 것입니까? – Guy

+0

@Guy. . . 'col1'이 프라이 머리 키라면, in 문에서 ID를 정렬 해보십시오. MySQL이 하나씩 점검하고 인덱스가 메모리에 맞지 않는다면 성능에 도움이 될 수 있습니다. –