2013-10-09 4 views
3

조직 이름이있는 1.6M IP 범위의 테이블이 있습니다. IP 주소는 정수로 변환됩니다. 표는의 형태 :범위 테이블의 효율적인 조회

enter image description here

나는 조직 이름으로 변환 할 필요 (예를 들어, 321223, 531223, ...) 2000 고유 한 IP 주소 목록을 가지고있다.

나는 IP_fromIP_to에 인덱스와 MySQL의 테이블로 변환 테이블을로드. 2000 IP 주소를 반복하고 IP 주소 당 하나의 쿼리를 실행하며 15 분 후에도 보고서가 계속 실행 중입니다. 내가 사용 쿼리는이 배치 룩업을 할 수있는보다 효율적인 방법이

select organization from iptable where ip_addr BETWEEN ip_start AND ip_end 

입니까? 좋은 해결책이라면 내 손가락을 사용하겠습니다. 누군가 Ruby 전용 솔루션을 가지고있는 경우 Ruby를 사용하고 있다고 언급하고 싶습니다.

+0

'(IP_from, IP_to)'에 R-Tree (공간) 색인을 생성하려고합니다. – eggyal

+0

어떤 색인을 사용하셨습니까? –

+1

스키마와 쿼리와 같은 더 많은 정보가 필요합니다. Ruby와 Rails가 왜 태그 인지도 알아야합니다. –

답변

4

이미 ip_start에 인덱스를 감안할 때, 이것은 당신이 (이 예에서는 1234) IP 당 하나의 액세스 만들고 싶어 가정, 가장 잘 사용하는 방법입니다 :

select organization from (
    select ip_end, organization 
    from iptable 
    where ip_start <= 1234 
    order by ip_start desc 
    limit 1 
) subqry where 1234 <= ip_end 

이 사용하는 당신의 인덱스는 limit 1 때문에 즉시 중지되는 스캔을 시작합니다. 비용은 단순한 색인 된 액세스보다 약간만 높아야합니다. 물론이 기술은 ip_startip_end으로 정의 된 범위가 겹치지 않는다는 사실에 의존합니다.

원래 접근법의 문제점은이 제약 조건을 인식하지 못하는 mysql이 인덱스를 사용하여 쿼리에 대한 모든 일치 항목을 찾는 데 필요한 스캔을 시작하거나 중지 할 위치 만 결정할 수 있다는 것입니다. .

+0

선생님, mysql (sql) 신입니다. 원래의 질문에서 색인과 내 쿼리를 사용하여, 1) 9 자리 이하의 IP 주소 (예 : 248082010)가 ~ 40ms가 걸렸습니다. 2) 십억을 초과하는 IP 주소 (예 : 1823194021)는 약 600ms가 걸리고 그 결과 성능이 저하됩니다. 쿼리를 사용하면 모든 작업에 0.5ms가 소요됩니다. 와우. – gitb

+1

고맙습니다. @ gitb,하지만 내가 신이라면 세상은 판테온이 될거야 ;-) 질문 제목을 "범위 테이블에서 효율적인 조회"로 변경하면 신경 쓸 수 있을까요? (또는 어쩌면 당신은 더 나은 타이틀을 가지고 있습니다). 그것은 "스택 오버 플로우의 효율적인 조회"의 방향이 될 것입니다. –

0

아마도이 종류의 조회를 수행하는 가장 효율적인 방법은 조회하려는 주소 목록을 데이터베이스의 임시 테이블에로드하고 각 주소를 a로 검사하는 대신 SQL 조인과의 교차점을 찾는 것일 수 있습니다. 별도의 SQL 문.

어쨌든 (IP_from, IP_to)에 색인이 있어야합니다.

+0

아마도 내 2000 IP 주소 중 아무 것도 조회 테이블에 없을 것입니다. ** ~ ** 및 ** ~ ** 필드 사이에 있습니다. 그래서 나는 어떻게 내가 조인을 할 수 있는지 보지 못합니다. – gitb

+0

당신은'JOIN ON ip> = ip_from AND ip <= ip_to'라고 쓸 수 있습니다.'='와의 조인만큼 효율적이지는 않지만 적절한 인덱스를 사용하면 훨씬 나 빠지지 않을 수 있습니다. – Joni

+0

@ Joni, "적절한 인덱스"가 mysql에 오직 하나의 레코드가 주어진'ip'의 조건과 일치 할 수 있다는 것을 알려줄 수 있습니까? –

관련 문제