2011-09-28 4 views
1

본질적으로 위치의 위도와 경도가있는 큰 이름의 테이블 (InnoDB)을 가지고있다. 내 쿼리는 다음과 같습니다Effecient InnoDB의 컬럼에있는 텍스트를위한 SELECT

SELECT columns FROM table 
WHERE latitude BETWEEN latMin AND latMax 
AND longitude BETWEEN longMin AND longMax 
AND location LIKE '%mcdonalds%' 

유일한 인덱스는 자동 증가 열의 기본 인덱스입니다.

FULLTEXT이

하나의 옵션은 내가 위도와 경도에 인덱스를 추가하고

SELECT id FROM table WHERE 
latitude BETWEEN latMin AND latMax 
AND longitude BETWEEN longMin AND longMax 

을하고 있었다 시도 옵션을 선택하지 않습니다 그래서 그때 내가 이노를 사용하는 것을 선호

$stringOfIds = implode(",",$result); 
SELECT columns FROM table WHERE id IN ($stringOfIds) 
AND location LIKE '%mcdonalds%' 

$ 결과가 수천 개의 항목을 가질 수 있고 너무 많은 메모리를 필요로하기 때문에 확장 성이 좋지 않습니다.

지금은 전체 테이블 스캔 (위의 첫 번째 쿼리)을 사용했지만 쿼리 당 0.5-1 초가 걸리므로 도움이 될 것입니다.

감사

+0

afaik, 전체 텍스트 색인에는 고유 한 값이 필요하지 않습니다. –

+0

고유 한 레코드가 필요한 전체 텍스트 색인은 없습니다. 이것은 'like blahblah %'와 같은보다 효율적인 텍스트 검색을하는 방법 일뿐입니다. 어쨌든 전체 텍스트 색인은 고유 할 수 없습니다. 유일한 일반 인덱스 만 고유하게 만들 수 있습니다. –

+0

아, 알았어요. 하지만 InnoDB를 사용하는 것을 선호하고 InnoDb는 FULLTEXT를 지원하지 않습니다. 맞습니까? –

답변

0

표준 B-TREE 인덱스는 쿼리 이런 종류의에 적합하지 않다. 지리 유형을 사용하도록 디자인을 변경 한 다음 creating a SPATIAL index을 사용하는 것이 좋습니다. 그런 다음이 인덱스를 MBRContains과 함께 사용하여 경계 상자 내에있는 모든 지점을 빠르게 찾을 수 있습니다.

업데이트 : 공간 인덱스를 생성 할 때 MyISAM이 주석에서 지적되어야합니다.

+0

죄송합니다. column1, column2 외에도 쿼리와 광산의 차이점을 볼 수 없습니다. 또한, InnoDB는 공간 인덱스를 사용할 수 없습니다. –

+1

@AndrewPark, 성가신 아뇨. 적절한 GIS 지원을 원하면 postgreSQL로 전환해야합니다. 또는 MyISAM을 사용하십시오.하지만 경계 사각형 만 있습니다. – Johan

+0

@ 앤드류 파크 : 죄송합니다. 이미 시도한 것을 보지 못했습니다. 네, SPATIAL 인덱스를 추가하기 위해 MyISAM을 사용해야합니다. 나는 그것을 잊었다. 아마도 당신은 master 테이블이 InnoDB로 남아있을 수 있도록 별도의 테이블에 공간 데이터를 저장할 수 있습니다. ID를 사용하여 두 테이블을 조인 할 수 있습니다. –

관련 문제