2012-10-12 4 views
0

글쎄, 모든, 내 영어로 죄송합니다. 사용자가 블로그 페이지와 같은 텍스트를 포함 할 수있는 쿼리를 테이블에서 수행하려고합니다. 사용자는 html 형식으로 콘텐츠를 디자인 할 수 있습니다. 내 테이블에는 다음과 같이 저장됩니다 :쿼리 매우 느린 longtext 필드 innodb 테이블

Estadísticas<br /> 
<table border="0"> 
<tbody> 
<tr> 
<td>Columna 1</td> 
<td>Columna 2</td> 
</tr> 
<tr> 
<td>Columna 3<br /></td> 
<td>Columna 4<br /></td> 
</tr> 
</tbody> 
</table> 

나는 그 사용자가 원하는 모든 내용을 저장해야합니다. 필드 'texto'(내가 사용하고있는)는 longtext 필드이고 테이블은 innodb입니다. 전체 텍스트 검색을 사용할 수 없습니다. myisam 테이블에만 해당됩니다. 쿼리를 다음과 같이 작성했습니다.

"SELECT * FROM texto WHERE texto like '%$variable%'" 

쿼리는 매우 느리고 영원합니다. 테이블에는 849 개의 레코드가 있습니다. phpmyadmin에 같은 쿼리를 작성하면 매우 오랜 시간이 걸립니다. 그러나이 분야에는 큰 레코드가 있습니다. 일부 레코드에는 비디오 html, 테이블, 이미지가 있지만, 위와 같은 텍스트입니다.

내가 할 수있는 일 ??? 어떻게 쿼리의 성능을 향상시킬 수 있습니까 ??? 모든 도움에 감사드립니다. 고마워. 그리고 다시, 나의 영어에 유감스럽게 생각한다.

답변

1

불행하게도 클러스터 된 인덱스 또는 클러스터되지 않은 인덱스는 like '%...' 쿼리를 처리 할 수 ​​없습니다. 가장 좋은 해결책은 데이터를 일부 전체 텍스트 검색 엔진 (예 : SOLR)으로 내보내고이 엔진을 사용하여 사용자 쿼리를 수행하는 것입니다. 그것이 불가능하면 다른 해결책은 텍스트 인덱스의 역할을하는 tokens 테이블을 만드는 것보다 :

docid는 데이터 테이블을 참조
create table tokens(
    token varchar(100) not null, 
    docid int not null references testdo(id), 
    constraint PK_tokens primary key (token, docid) 
); 

는 (나는 그것을 testdo 이름).

은 그럼 당신은 예 :

insert ignore into tokens values 
('Estad', 1), 
('Columna 1', 1), 
('Columna 2', 1), 
('Estad', 1); 

공지 사항 자동으로 올 수있는 중복을 무시합니다 ignore 키워드, 몇 가지 일반적인 html로 표현하여 사용자에게 블로그 게시물을 분할하여 tokens 테이블을 작성해야합니다. 이 인덱스와 키 조회를 사용하고 같은 훨씬 더 빨리 실행해야

select * from testdo d 
    inner join tokens t on t.docid = d.id where t.token like 'Col%' 

: tokens 테이블이 데이터로 채워 사용하면 같은 당신의 쿼리를 수정할 수 있습니다.

추신. 문서에서 주어진 단어의 발생 횟수를 유지하는 카운트 열을 추가하여 tokens 표를 향상시킬 수 있습니다. 그런 다음이 열을 기준으로 결과를 정렬하고 검색어와의 관련성을 높일 수 있습니다.

+0

감사합니다. 도움을 주셔서 감사합니다. 이것은 많은 도움이되었습니다. 고맙습니다. –