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 초 소요, 슈퍼 느리지 만 매우 빠르지 아니다 에테르.
내 질문은 : 나는 더이 단일 쿼리 내 테이블을 최적화 할 수 있습니까?
나는 다음과 같은 일을 시도 :
- 변경의 MyISAM에 스토리지 엔진이 쿼리는 약 1.9 초를 소요했다.
- 은 '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
에 인덱스를 추가
InnoDB 테이블에 SPATIAL 색인을 만들었습니까? – Quassnoi
먼저 MyISAM으로 변환했습니다. – RonSper