2015-01-17 3 views
0

2M 개 이상의 행이있는 큰 ip_locations 테이블이 있습니다. 특정 IP가 지정되면 (자), IP_LOCATION 기록을 선택합니다 : 비교 조건이있는 mysql 대량 SELECT

SELECT * FROM ip_locations WHERE ip >= start_ip and ip <= end_ip; 

이제 문제는 IP 배열 [ip1, ip2, ip3, ...]. The size of the batch can be 1000+ 제공, 일괄 선택에 효율적으로이 작업을 수행하는 방법이다. 이 작업을 수행하는 간단한 방법은

수 있었다 그러나 나는이 일을 더 우아하고 효율적인 방법이 있어야 확신합니다. 또한 배치 선택 결과에서 해당 레코드와 연관된 각 IP를 어떻게 얻을 수 있습니까?

+0

귀하의 솔루션은 나에게 좋아 보인다 - 그게 내가 그것을 할 거라고 방법입니다. 검색어 크기를 1MB 미만으로 유지하려고 시도했지만 이전에는 더 큰 검색어에 대한 문제가 발생했습니다. – Sebastian

+1

이러한 ips를 사용하여 테이블을 만들고 주 테이블의 JOIN 열을 인덱싱하십시오. – Mihai

+0

범위 중 하나와 일치하는 모든 레코드를 가져 오시겠습니까? –

답변

0

는 @Mihai 아이디어를 참조하면,이 즉, 다음과 같은 방법을 할 수있는 :

SELECT 
    ip_locations.* 
FROM 
    ip_locations 
    INNER JOIN 
    (
    SELECT ip1 AS ip_to_check 
    UNION 
    SELECT ip2 AS ip_to_check 
    .... 
    UNION 
    SELECT ipN AS ip_to_check 
    ) AS ip_tab 
     ON (ip_tab.ip_to_check >= ip_locations.start_ip 
     and ip_tab.ip_to_check <= ip_locations.end_ip)