2012-03-31 3 views
1

나는 이것을 추적하려고 많은 시간을 보냈습니다. 내 사이트 (http://www.devbridge.com/projects/autocomplete/jquery/)에 박스형 자동 완성 기능을 사용했습니다. 단어를 입력 할 때 mySQL 데이터베이스에서 검색 할 곳을 처리하기 위해 페이지에 GET 변수로 보냅니다. 페이지는 다음과 같습니다.큰 데이터베이스 검색으로 자동 완료가 느림

$get = $_GET['query']; 
$query = "SELECT title,author,id,isbn10,isbn13 FROM textbook 
     WHERE title LIKE '" . $get . "%' 
     OR author LIKE '" . $get . "%' 
     LIMIT 5 
     "; 
$result = mysql_query($query,$connection); 
$resString = ""; 
$idString = ""; 
while($data = mysql_fetch_array($result)){ 
$resString .= "'" . title($data['title']) . " by " . $data['author'] . "',"; 
$idString .= "'" . $data['id'] . "',"; 
} 
$resString = rtrim($resString, ','); 
$idString = rtrim($idString, ','); 
$code = "{\n"; 
$code .= "query:'" . $get . "',\n"; 
$code .= "suggestions:[" . $resString . "],\n"; 
$code .= "data:[" . $idString . "]\n"; 
$code .= "}"; 
echo $code; 

결과로 읽히고 다시 촬영 된 기본 JSON 데이터 세트를 출력합니다. 문제는 그것이 정말로 느리다는 것이다. "LIMIT 5"는 톤을 약간 늘리는 데 도움이되었습니다. 그러나 초기 결과 집합이 나타난 후에도 여전히 느리게 실행됩니다. 나는 "콧노래"를 타이핑 할 수 있으며, 빠른 결과 세트로 돌아올 것입니다. 그러나 그 이후의 모든 글자/단어는 4-6 초가 걸릴 것입니다. 데이터베이스는 대략 300K 레코드입니다. 임 그냥 물건을 빠르게하는 방법을 알아 내려고

database http://semesterkey.com/images/data.jpg

: 내 데이터베이스 구조 페이지의 사진을 첨부. 나는 내 데이터베이스 구조일지도 모른다고 생각한다. 나는 전혀 모른다. 도와 주셔서 미리 감사드립니다.

+0

@ Yogesh가 맞습니다. 검색 할 필드를 색인화해야합니다. –

+0

클러스터 된 인덱스 또는 클러스터되지 않은 인덱스를 권장 하시겠습니까? 여기 뉴비! – user791187

답변

1

유일한 해결책은 데이터베이스에 자동 완성에 표시 할 열에서 그 사용 인덱싱이 당신이

+1

더 많은 해결책이 있을지도 모르지만이 시도가 가장 먼저 시도됩니다. –

+0

아름답게 일했습니다! 고맙습니다! – user791187

0

예, 문제에 대한 답은 (저자, 제목에 인덱스입니다 도움이되기를 바랍니다,이된다) 컬럼 그룹. DB에 의해 사용 된 공간의 양이 증가하고 테이블에서 INSERT, UPDATE, DELETE의 성능이 저하되지만 질의 성능이 향상됩니다.

+0

클러스터되지 않은 인덱스 또는 클러스터 된 인덱스를 권장 하시겠습니까? 사과 드리며, 프로그래밍의 영역에 젖은 채 젖어 있습니다! – user791187

+0

먼저 클러스터되지 않은 클러스터를 사용해보십시오. 성능이 만족스럽지 않은 경우에만 클러스터형 인덱스로 이동할 수 있습니다. 클러스터 된 레코드가 물리적으로 레코드를 재정렬합니다. 그것은 어려운 핵심 업무입니다. –

0

작성자와 제목에 대한 색인을 생성하면 성능을 향상시키는 데 도움이 될 수 있습니다.

0
파악하지 않는 사람들을 위해

구문 도움이되는 답변을 위

ALTER TABLE Your_table_name ADD INDEX () COLUMN_TITLE;

관련 문제