2011-09-25 3 views
5

1 백만 개의 행을 가진 InnoDB MySql Geo ID 테이블이 있습니다. 테이블 구조는 이것이다 :하나의 쿼리에 대해이 MySQL 테이블을 더 최적화하는 방법

CREATE TABLE `geoid` (
    `start_ip` int(11) NOT NULL, 
    `end_ip` int(11) NOT NULL, 
    `city` varchar(64) NOT NULL, 
    `region` char(2) NOT NULL, 
    PRIMARY KEY (`start_ip`,`end_ip`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

가 한 종류의 쿼리가이 테이블에 대해 실행됩니다

SELECT city, region FROM geoid WHERE 1259650516 BETWEEN start_ip AND end_ip 

이 쿼리에 대한 ~ 0.4228 초 소요, 슈퍼 느리지 만 매우 빠르지 아니다 에테르.

내 질문은 : 나는 더이 단일 쿼리 내 테이블을 최적화 할 수 있습니까?

나는 다음과 같은 일을 시도 :

  1. 변경의 MyISAM에 스토리지 엔진이 쿼리는 약 1.9 초를 소요했다.
  2. 은 'geoid.start_ip < = 1259650516 및 1259650516 < = geoid.end_ip'는 WHERE 문을 사용합니다. 그러나 .4 ish 대신에 실행하는데 약 0.5 초가 걸린다.

나는 더 작게 만들기 위해 테이블의 모든 쓸모없는 행을 제거했습니다. 1 백만 줄이 필요합니다. 아래 문서에

UPDATE/솔루션

감사합니다, 여기에 내가이 문제를 해결하기 위해 한 일이다.

내가 위의 표에 새 열을 추가 (단지 다른 관심있는 사람들이 답을하기 위해) : 다음 start_ip에서 지리적 데이터로 새 열을 작성

ALTER TABLE `geoid` ADD `geoip` LINESTRING NOT NULL 

및 end_ip

GeomFromText(CONCAT('LINESTRING(', start_ip, ' -1, ', end_ip, ' 1)')) 

나는 모든, 거기에서

CREATE SPATIAL INDEX geoip_index ON geoid(geoip); 

새로운 열에 공간 인덱스를 생성 검색어를 다음과 같이 변경해야합니다.

SELECT city, region FROM geoid WHERE MBRContains(geoip, GeomFromText(CONCAT('POINT(', 1259650516, ' 0)'))); 

그리고 완료되었습니다. 이 쿼리는 .42 초에서 .0003 초까지 내려갔습니다 !!!!!!!

나는이 색인을 아주 좋아합니다. 고맙습니다. 희망이 도움이됩니다. end_ip에 인덱스를 추가

+0

InnoDB 테이블에 SPATIAL 색인을 만들었습니까? – Quassnoi

+0

먼저 MyISAM으로 변환했습니다. – RonSper

답변

3

보십시오. 이 경우 쿼리가 두 배 정도 빨라지는 경우가 있습니다. this article에 설명 된대로

훨씬 더 나은 성능에 대 한 당신은 공간 인덱스를 사용해야합니다.

+1

기본 이외에? : PRIMARY KEY ('start_ip','end_ip'), KEY'start_ip' ('start_ip'), KEY'end_ip' ('end_ip'). 그것은 아무것도 바뀌지 않았습니다. – RonSper

+0

@Ron Sper : 모든 경우에 쿼리의 속도가 향상되지 않으며 다른 경우에는 속도가 상대적으로 느립니다. 훨씬 더 나은 성능을 원하는 경우 SPATIAL 인덱스를 고려할 수 있습니다. 이 기사 참조 : http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/. 그러나 초보자를위한 것은 아닙니다. –

+1

와우, 완벽 해. 그것이 내가 원했던 바로 그 것이다. 고맙습니다. – RonSper

0

모든 필드가 쿼리에 포함에 인덱스를 만들어보십시오. 이 특별한 경우 두 필드 (start_ip 및 end_ip)에 하나의 색인을 생성하십시오.

관련 문제