2010-07-20 4 views
0

좋아하는 다른 방법이 있습니까? 참고 전체 텍스트 검색을 사용할 수 없습니다.MySQL LIKE 대안

여기에 내 mysql 코드입니다.

SELECT * 
FROM question 
WHERE content LIKE '%$search_each%' 
OR title LIKE '%$search_each%' 
OR summary LIKE '%$search_each%' 
+2

왜 좋아하지 않을지 말할 수 있습니까? 솔루션을 찾는 데 도움이 될 수 있습니다. –

+0

사이트 검색을 할 때보다 효율적인 방법이 있습니까? – lone

답변

2

음, MySQL은 regular expressions을 가지고 있지만 그 문제는 여러 좋아 함께 무엇을 부탁드립니다.

테이블이 이 실제로 일 때 규모가 커지지는 않지만, MySQL을 사용하는 사람들에게는 거의 관심이 없다는 것을 알고 있습니다. (MySQL에 대해 비방 할 수는 없지만, 많은 사람들을 알아 봤습니다. 작은 데이터베이스의 경우 오라클, DB2 또는 SQLServer (또는 ACID 속성이 그다지 중요하지 않은 NoSQL)와 같은 대형 데이터베이스를 사용하는 것처럼 보입니다.

당신이 말한대로, 경우

정말 대형 사이트에 사용할 계획이다.

그렇다면 모두 같은 것을 피해야합니다. 전체 텍스트 검색을 사용할 수없는 경우 자체 솔루션을 롤업해야합니다.

이전에 사용한 적이있는 한 가지 방법은 테이블에 삽입/업데이트/삭제 트리거를 사용하여 또 다른 테이블을 채우는 것입니다. 삽입/업데이트 트리거는 다음과 같아야합니다.

  • 문제의 문자열을 평가하십시오.
  • 단어로 구분하십시오.
  • 철자없는 단어 (모든 숫자, 'at', 'the', 'to'등과 같은 잡음 단어)를 버립니다.
  • 원래 표의 행에 표식이있는 표에 단어를 추가하십시오.

검색을 위해이 테이블을 사용하면 거의 확실하게 여러 개의 LIKE보다 빠릅니다. 기본적으로 롤 - 자신 만의 일종의 전체 텍스트 검색으로, 실제로 색인을 생성해야하는 대상을 세부적으로 조정하고 제어 할 수 있습니다.

이점은 업데이트 프로세스 중에 선택 프로세스 동안 속도가 현저히 낮기 때문입니다. 이것은 모든 읽기에서 개별 단어를 색인하는 비용을 상각하기 때문에 작성된 것보다 더 자주 읽는 것이 가장 좋습니다 (대부분). 모든 읽기에 비용이 들지는 않으므로 데이터가 변경 될 때만 비용을 지불하는 것이 좋습니다.

그리고 삭제 트리거는 실제 레코드를 참조하는 색인 ​​테이블의 모든 항목을 단순히 삭제합니다.

Comments: 
    id   int 
    comment  varchar(200) 
    -- others. 
    primary key (id) 

Words: 
    id   int 
    word  varchar(50) 
    primary key (id) 
    index  (word) 

WordsInComments: 
    wordid  int 
    commentid int 
    primary key (wordid,commentid) 
    index  (commentid) 

설정 대다 ID-ID의 관계 (즉, 별도의 단어와 WordsInComments 테이블) 대신 ID-텍스트가 (하나에 그들을 결합 :

테이블 구조는 뭔가 같은 것)는 세 번째 정규 형식을 위해 올바른 것이지만, 함축 된 의미를 이해한다면 속도와 결합을 위해 저장 공간을 거래하는 것을 살펴볼 수 있습니다.

+0

정말 큰 사이트에 사용할 계획입니다. – lone

+0

정말 큽니까? 구글처럼 내 피자 가게처럼? – Tebe