2012-03-14 4 views
1

나는 새로운 일에 대한 테스트를 받았다, 내가 가야 할 길에, 질문은 다음과 같다 결정할 수 없습니다 : 주어진 데이터베이스 테이블에SQL 성능

(이

message_id | INT PRIMARY AUTO_INCREMENT 
user_id | INT FOREIGN_KEY 
from_id | INT FOREIGN_KEY 
message | TEXT 

가 수행하는 빠른 것,의 내가 특정 사용자의 모든 메시지의 텍스트를 검색 할 가정 해 봅시다 :

$query = "SELECT * FROM messages m WHERE user_id='$id' AND message LIKE '%$string%'; 

을하거나 것 나는 또 다른 질문)을 위해 설계 빠른 작업 :

$query = "SELECT * FROM messages m WHERE user_id='$id'; 

결과 세트에서 실행하면 substr_count()?

아니면 더 빠르고 효율적인 방법이 있습니까?

+1

가장 좋은 방법은 일부 벤치 마크 데이터로 시도하는 것입니다. –

답변

5

항상 데이터베이스 측에서 검색해야합니다. LIKE '%word%'은 항상 전체 테이블 스캔을 발생 시키지만 모든 행을 직렬화하여 클라이언트로 전송하고 다시 deserialize 할 필요는 없습니다.

또한 전체 텍스트 인덱스를 사용하도록 쿼리를 최적화하거나 단어의 마지막 부분 (예 : LIKE 'word%') 만 일치시킬 수있는 경우 인덱스를 통해 평가할 수 있기 때문에 전체 테이블 검색이 필요하지 않습니다 (if 그것은 존재한다).

+0

어떻게 쿼리를 최적화 하시겠습니까? 미안하지만, 만약 당신이 정교 할 수 있다면 완전히 이해하지 못했습니다 ... 모든 최적화가 전체 텍스트 인덱스이거나 뭔가를하고 있다면 ... –

+1

제가 말했던 것처럼 고정 된 접두어 (''LIKE 'word %'' ')는 인덱스에 대해 평가할 수 있습니다. 그래서''SELECT * FROM table WHERE col = '% word %''질의 대신에''SELECT * FROM table WHERE col = 'word %'''를 질의 할 수 있지만, 필요합니다. 당신은 그걸 결정할 수있는 유일한 사람입니다. 또한 대부분의 데이터베이스 시스템은 fulltext index라는 구조를 지원합니다. MySQL의 경우 http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html을 참조하십시오. PostGreSQL의 경우 http://www.postgresql.org/docs/9.1/을 살펴보십시오. static/textsearch.html - 알 수없는 접두사를 검색 할 수 있습니다. – ckruse

0

첫 번째 방법은 빠릅니다. 일치하는 메시지의 개수를 찾는 것이 목적 일 경우 더 빨리 수행해야합니다.

SELECT count(*) FROM messages m WHERE user_id='$id' AND message LIKE '%$string%