2010-02-15 3 views
9

문자열에서 정수까지의 맵이 있습니다. MySQL 데이터베이스에서이지도를 저장하려면 나는 다음과 같은 테이블 생성 :MySQL 데이터베이스의 TEXT 열을 인덱싱하는 올바른 방법입니까?

CREATE TABLE map(
    Argument TEXT NOT NULL, 
    Image INTEGER NOT NULL 
) 

길이가 예측 불가능하기 때문에이 인수의 텍스트 유형을 선택을, 현재 가장 긴 기록은 2290 개 문자를 가지고 있으며, 평균 길이는 88 개 문자입니다.

성능 문제가 발생하여 Argument 열에 인덱스를 추가하려고했지만 길이를 지정해야한다는 것을 알았으므로이 제한을 피하기 위해 해시 값 (md5 또는 기타)을 포함하는 새로운 정수 열을 추가했습니다. 열 값을 인수로 지정하십시오.

ALTER TABLE map ADD COLUMN ArgumentHash INTEGER; 

그리고 성능에 대한 문제가 사라졌습니다 그 이후로 결합 인덱스

CREATE INDEX argument_index USING HASH ON map(ArgumentHash, Argument(80)); 

. 이 문제를 해결하는 올바른 방법인지 여부를 묻고 싶습니다.

답변

3

"올바른"방법이 없다고 생각합니다. 그 이유는 해당 열을 사용하는 대상에 따라 다릅니다.

내 경험상 큰 텍스트 열을/선택하고 싶지는 않습니다. 텍스트는 대개 일부 다른 키로 검색된 데이터입니다 (예 : 전체 텍스트, Lucene 등).

실제로 정확한 텍스트가 필요하다면 큰 필드에서 일치하는 경우 해시를 사용하면 색인을 더 작게 유지할 수 있으므로 해시를 사용하는 것이 더 효율적일 수 있습니다. 내 생각 엔 해시의 크기보다 큰 인덱스 크기를 사용해야하는 경우 (일반적으로 텍스트의 시작 부분에 얼마나 가까운가에 따라 값이 다름) 해시를 사용합니다.

가장 좋은 방법은 시도해 보는 것입니다. 대표적인 데이터를 사용하여 두 가지 접근법을 모두 프로파일 링하고 알아냅니다.

+1

TEXT와 달리 VARCHAR가 인라인으로 저장되고 자주 액세스하는 데이터에 대해 더 나은 성능을 제공하므로 VARCHAR이 인덱스에 사용할 수있는 더 좋은 열 유형이라는 것을 알게되었습니다. http://stackoverflow.com/users/144287/brenton-alker –

관련 문제