2013-07-16 2 views
1

다음 코드는 10 개 항목을 반환합니다. 지금은 느린 것 같습니다.MySQL 왼쪽 조인이 느립니다.

SELECT a.id 
     , a.patient_name 
     , a.phone 
     , p2.card_number 
FROM patients as a 
LEFT JOIN patient_insurance as p2 
ON a.id=p2.patient 
WHERE a.patient_name LIKE '%$_GET[term]%' 
     OR a.id LIKE '%$_GET[term]%' 
     OR a.phone LIKE '%$_GET[term]%' 
     OR p2.card_number LIKE '%$_GET[term]%' 
LIMIT 10 

나는 환자 테이블에 12,107 항목을 가지고있는 patient_insurance 테이블에 2296 항목

그것은 16 기가 바이트 램과 제온 2 프로세서 리눅스 서버 ..이 로컬 호스팅

+0

아마도 테이블의 색인이 제대로 생성되지 않았을 수 있습니다. 그것은 환자 ID에 의해 색인되어야 하는가? –

+1

(** : ** 귀하의 코드는 SQL 삽입에 취약합니다. **) 모든 인덱스? 와일드 카드 접두사를 피하기 위해 데이터를 개조하는 방법은 무엇입니까? 전체 텍스트 검색으로 간주 되나요? – eggyal

+0

더 나은 코드를 제공합니다.이 사이트는 인터넷에 연결되어 있지 않아도 로컬에 호스팅됩니다. –

답변

3

사용하는 쿼리 LIKE을 와일드 카드로 사용하는 경우 전체 텍스트 검색 솔루션을 사용하는 경우보다 수천 또는 수천 배 더 느림으로 바인딩됩니다. 와일드 카드 검색을 더 빨리 수행 할 수있는 문자열 열에 정의 할 수있는 B- 트리 색인은 없습니다.

내 프레젠테이션 Full Text Search Throwdown을 읽으십시오. 여기에서 MySQL에 대한 전체 텍스트 검색 솔루션을 비교해보십시오.

짧은 대답은 : Sphinx Search입니다.

관련 문제