2009-11-21 3 views
1
내 MySQL의 테이블 중 하나에서

, 나는 다음과 같은 한 열 : C는/C++는MS 오피스, 리눅스 산업 수도 :개선 검색 성능

Skills  varchar(80) 
Industry varchar(40) 
Address  varchar(100) 

기술과 같은 텍스트를 포함 할 수 있습니다 금융, IT 등 주소는 도시 이름과 함께 완전한 우편 주소를 포함합니다. 별도의 도시 란이 없습니다.

내 웹 페이지에는 사용자가 각 열에 대해 키워드를 입력 할 수있는 검색 상자가 있습니다.

Select studentname where skills like '%...%'; 

나는 성능뿐만 아니라 검색 결과를 향상시키고 자 : 아래로 난 SQL 쿼리를 사용합니다. 예를 들어 대신 Linex과 같은 스킬을 입력했을 수 있습니다. 그래서, 내 검색은 약을 반환해야합니다. 시합.

검색을보다 정확하게하고 성능을 향상시킬 수있는 방법을 알려주세요. 현재, 나는 skills, addressindustry 란에 색인을 정의했다. 그러나 성능이 좋지 않습니다.

테이블 엔진은 InnoDB입니다.

문제

편집 우리는 다양한 기관에서 미리 채워진 MS 엑셀 시트를받을 수 있습니다. .NET 응용 프로그램은 Excel 시트의 열 값을 읽고이를 원격 데이터베이스에 저장합니다. 분할 테이블의 경우 응용 프로그램을 변경해야합니다.

답변

9

는 SQL 절

like '%...%' 

당신이 원하는 경우에 당신이 할 수있는 가장 파괴적인 것입니다 데이터베이스 성능.

기술, 산업 등이 값 (예 : 'C', 'C++', 'SQL'등)으로 고정되어있는 다른 테이블로 구분되어 있는지 확인해야합니다.).

그런 다음 사람과 기술간에 다 대다 테이블을 가져야합니다. 예를 들어 : 레이아웃의이 종류의 쿼리의 속도를 향상시킬 것 모두

People: 
    PersonId primary key. 
    Other person details. 
Skills: 
    SkillId primary key. 
    SkillName. 
    Other skill details. 
PeopleSkills: 
    PersonId references People(PersonId). 
    SkillId references Skills(SkillId). 
    primary key (PersonId,SkillId). 
    index on (SkillId). 

대규모 잘못된 데이터 입력이 불가능하게 만 허용하는 경우 기술 테이블에서 검색어를 입력 (여기서 어떤 'LINEX'가능 'Linex'가 기술 테이블에 없기 때문에 'Linux'를 의미했습니다.

내가 사용할 수없는 규칙 중 하나는 테이블 디자인입니다. 열 내에서 약간의 정보를 추출하려는 경우 해당 정보는 자신의 열에 있어야합니다.쉼표로 구분 된 값 (개별 열 값을 추출하려는 위치)이있는 단일 열이있는 테이블을 작성하여 사람들이 겪는 성능 문제의 수는이를 입증해야합니다.

모든 기술과 산업이 별도의 테이블에 있는지 확인해야하는 단점은 속도와 정확성이 향상되었습니다. 데이터베이스는 이어야하며 항상은 세 번째 정규 형식으로 설계되어야합니다. 결과를 이해하고 (트리거 또는 계산 된 열을 사용하여 잘못된 데이터의 가능성을 완화 할 경우) 성능상의 이유로 2NF로 회귀 될 수 있지만 이는 거의 필요하지 않습니다.

4

전체 텍스트 검색과 함께 색인을 사용하는 것이 좋습니다. InnoDB는 전체 텍스트를 지원하지 않습니다,하지만 당신은 등 아파치 루씬, Zend_Search_Lucene (PHP)과 같은 외부 엔진을 사용할 수 있습니다

0

개별 단지에 대한 테이블의 기술 다음은 현재 테이블에 연결하기 위해 ID를 사용,이 같은 일부 :

Skills: Id, Name 
Skills_YourTable: Skills_Id, YouTable_Id 
YouTable: Id, another fields. 

EX :

Select y.fields 
from YourTable as y 
    join Skills_YourTable as sy 
    join Skills as s 
where s.Name = 'MS Office' 
0

다른 포스터가 가지고있는 먼저 데이터베이스를 정규화하십시오. 검색 맞춤법 오류를 처리하기 위해

, 당신은 sphinx

0

를 보라. Zend Search Lucene 프레임 워크를 살펴보십시오. 이것은 Lucene의 Java 버전을 기반으로합니다.

콘텐츠를 훨씬 더 효과적으로 검색 할 수 있습니다. 단일 단어, 구문, 범위, 퍼지, 근접, 부스팅, 강조 표시 등을 검색 할 수 있습니다.

그러나 검색 내용은 데이터베이스에 플랫 파일로 저장해야하며 콘텐츠를 동기화 상태로 유지해야합니다 . 그러나 그것은 검색의 힘이 그것의 가치가 있다고 말했다. 또한 빠르고 빠릅니다.

Google : 자세한 정보는 php lucene zend.

Also see this for a great tutorial

1

또 다른 해결책은 다른 검색 기술을 사용하는 것입니다 시도 제공 할 수 있습니다 SOUNDS LIKE