2009-10-21 1 views
2

그래서 문자열이 포함 된 열이있는 MySQL에 데이터베이스 테이블이 있습니다. 대상 문자열이 주어지면 대상에 포함 된 하위 문자열이있는 모든 행, 즉 대상 문자열이 열의 수퍼 스트링 인 모든 행을 찾고 싶습니다. 순간 나는의 라인을 따라 쿼리를 사용하고 있습니다 :superstring 쿼리를 위해 데이터베이스를 최적화하는 방법은 무엇입니까?

SELECT * FROM table WHERE 'my superstring' LIKE CONCAT('%', column, '%') 

내 걱정이 확장되지 것입니다. 나는 현재 이것이 문제인지를 알기 위해 몇 가지 테스트를하고 있지만 대체 접근법에 대한 제안이 있다면 궁금해합니다. MySQL의 전체 텍스트 인덱싱에 대해 간략히 살펴 보았습니다.하지만 데이터가 주어진 문자열에 존재하는지 알아내는 것이 아니라 데이터의 하위 문자열을 찾는 방법으로도 사용됩니다.

+0

음, 나는 거기에서 아주 의도적으로 "초 수염"이라는 용어를 골랐습니다.나는 문자열이 대상 문자열을 포함하는 문자열을 포함하는 행을 찾는 부분 문자열 쿼리를 이해합니다. – Benno

+0

초경 구의 길이 및/또는 문자 범위에 '문제 영역'제한이 있다면 말할 수 있습니까? –

+0

... '열'필드의 부분 문자열의 길이가 너무 길 수도 있습니다. –

답변

0

그 대답은 당신이하지 않는 것 같습니다. 이러한 유형의 색인 생성은 일반적으로 사용할 수 없으며 MySQL 데이터베이스 내에서 원하는 경우 MySQL에 대한 자체 확장을 만들어야합니다. 내가 추구하는 대안은 응용 프로그램에서 색인 생성을 수행하는 것입니다.

답변 해 주신 모든 분들께 감사드립니다.

1

전체 텍스트 색인이 포함 된 임시 테이블을 만들고 '내 슈퍼 문자열'을 삽입 할 수 있습니다. 그런 다음 영구 테이블과 조인 쿼리에서 MySQL의 전체 텍스트 일치 구문을 사용할 수 있습니다. 모든 단일 행에 대해 일치하는 항목이 있는지 확인할 것이므로 영구 테이블에서 전체 테이블 검색을 계속 수행 할 것입니다. 하지만 적어도 '내 끈 주형'은 색인이 생성되어 현재 가지고있는 것보다 실적이 좋을 것입니다.

또는 columntable에서 선택하고 상위 수준 언어로 일치 검색을 수행 할 수도 있습니다. table에있는 행 수에 따라이 방법이 더 적합 할 수 있습니다. 클라이언트 서버 (웹 서버)에 과중한 작업을 오프로드하면 데이터베이스 서버의로드가 줄어들 기 때문에 종종 유리할 수 있습니다.

+0

그래, 나는 그걸 조사하려고했다. 지금은 테스트 장비를 설정하여 성능 수치를 확인하고 필요한 사항을 확인합니다. – Benno

0

슈퍼 스트링이 URL이고 하위 문자열을 찾으려면 하위 문자열을 점에 고정시킬 수 있는지 여부를 알아두면 유용합니다.

예를 들어, superstrings이 : 규칙은 '마피아'가 포함 된 경우

www.mafia.gov.ru www.mymafia.gov.ru www.lobbies.whitehouse.gov

및 첫 번째 2 개를 일치 시키려면 다음과 같이 말하십시오.

그렇지 않은 경우 URL을 [www, mafia], 'gov', 'ru'등으로 구문 분석 할 수 있습니다. ] 그러면 테이블의 각 요소를 조회하는 것이 훨씬 쉬워집니다.

+0

호스트 이름의 경우에는 그렇게 할 수 있지만 전체 URL의 경우에는 덜 유용합니다. 그래도 좋은 생각. – Benno

0

필자는 고객의 요구에 따라 성장할 수있을만큼 견고해야하는 견해를 사용하여 검색 솔루션을 만들었습니다. 예를 들어 :

 

CREATE TABLE tblMyData 
(
MyId bigint identity(1,1), 
Col01 varchar(50), 
Col02 varchar(50), 
Col03 varchar(50) 
) 

CREATE VIEW viewMySearchData 
as 
SELECT 
MyId, 
ISNULL(Col01,'') + ' ' + 
ISNULL(Col02,'') + ' ' + 
ISNULL(Col03,'') + ' ' AS SearchData 
FROM tblMyData 

SELECT 
t1.MyId, 
t1.Col01, 
t1.Col02, 
t1.Col03 
FROM tblMyData t1 
INNER JOIN viewMySearchData t2 
ON t1.MyId = t2.MyId 
WHERE t2.SearchData like '%search string%' 

 

그들은 다음 tblMyData에 열을 추가하기로 결정하고 그 열은 다음 검색 새로운 colums에 "SearchData AS"섹션을 추가하여 viewMysearchData을 수정해야 할 경우.

검색에 두 개의 열이 있다고 판단한 경우 "AS SearchData"섹션에서 원하지 않는 열을 제거하여 viewMySearchData을 수정하면됩니다.