2009-03-08 3 views
2

테이블에는 약 800 만 개의 행이 있습니다.SELECT * FROM 테이블 WHERE x IN (... 수백 int ... ...)

인덱스가 표시되면 테이블에서 "seq_in_index"가 1이고 데이터 정렬 A, 카디널리티 7850780, sub_part NULL이 아닌 키 이름 X에 고유하지 않은 색인이있는 것을 보여줍니다. NULL을 포장, index_type BTREE.

그래도이 쿼리는 실행하는 데 5 초가 걸릴 수 있습니다. int의 목록은 다른 시스템에서 가져온 것으로, 소셜 네트워크에서 우정을 표현하기 때문에 테이블에 저장할 수 없습니다.

대규모 IN 문보다 빠른 방법이 있습니까?

답변

12

ID 목록을 임시 테이블 (또는 MySql이 지원하는 경우 테이블 -var)로 변환하여 결합 할 수 있습니다.

테이블은 실제로 쿼리가 실행되는 동안 만 을 테이블에 저장하지 않습니다.

5

temporary table에 저장할 수 있습니다. 이 테이블은 데이터베이스에 영구적으로 저장되지 않을 것이고 결과 인덱스 (인덱스를 가정하면 임시 테이블도 인덱스라고 가정)가 인덱스를 병렬로 처리 할 수 ​​있고 인덱스 조회를 수행 할 필요가 없으므로 더 빠를 것이라고 생각합니다. 각 int에 대해 IN 절. 물론, MySQL은 IN 절을 최적화 할 수도 있고 인덱스를 사용한다는 것을 알고 있다면 실제로 같은 것을 할 수도 있습니다. 그래서 실제로 아무 것도 얻을 수 없습니다. 나는 시도를 줄 것이고 그것이 더 빠르는지 알 것이다.

4

다른 사람들이 제안한 것처럼 임시 테이블이 가장 적합한 솔루션입니다.

임시 테이블/in() 조건의 카디널리티와 행 수에 따라 최적화 프로그램이 순차 읽기가 로트보다 훨씬 빠르다는 사실 때문에 순차 스캔 사용에 의존 할 수 있음을 알아 두십시오 인덱스에서 무작위로 탐색합니다.

이 시점에서 관계를 다시 설계하는 것이 적절할 수 있습니다.

+0

+1 : 최적화 및 디자인에 대한 좋은 점 –

+0

예, 데이터베이스를 비정규 화하여이 쿼리가 필요하지 않게 할 생각입니다. – Bemmu