2010-12-16 4 views
0

작은 MyISAM 테이블에서 작동합니다. 크기는 약 30k이고 크기는 10MB입니다. 필드 중 하나는 varchar (500+)입니다. utf8_unicode_ci를 사용하기 때문에이 필드를 인덱싱 할 수 없으며 (동시에 1000 바이트 제한을 초과했습니다) 동시에이 필드를 기반으로 많은 "get_or_create"쿼리를 수행해야합니다. 데이터베이스를 최적화하려고하지만 상황이 여전히 느립니다.필드 길이가 md5 인 MyISAM 키 길이 제한이

md5의 varchar 값을 보유하고 조회 용으로/색인을 생성하는 추가 필드를 만드는 것이 좋은 해결책입니까? 누구든지이 접근법을 시도 했습니까?

+0

varchar 열에 어떤 종류의 데이터를 저장합니까? 구체적인 예를 들어주세요. – Theo

+0

이 필드에는 웹 사이트 링크가 있습니다. – Riz

답변

1

나에게 키와 같은 넓은 열을 사용하는 것은 좋지 않은 생각이지만, 여러분이 제안한 것과는 분명히 다른 것을 할 수 있습니다. MD5를 사용할 필요조차 없으므로 충돌을 거의 발생시키지 않는 해시 함수 만 있으면되지만 고유성은 필요하지 않습니다. CRC32은 작은 값을 생성하며 매우 빠릅니다.

CREATE TABLE data (lots_of_text VARCHAR(500)); 

이로 변경을 :

이 테이블은 다음과 같습니다 말

INSERT INTO data (lots_of_text, text_hash) 
VALUES ("lots and lots of text", CRC32("lots and lots of text")); 

을 그리고 당신은 검색 할 수 있습니다

CREATE TABLE data (text_hash INT, lots_of_text VARCHAR(500), INDEX (text_hash)); 

당신이 행을 삽입 할 때 당신이 할 다음과 같은 행 :

SELECT lots_of_text FROM data 
WHERE text_hash = CRC32("lots and lots of text") 
AND lots_of_text = "lots and lots of text"; 

쿼리 text_hash에 인덱스를 사용하지만 CRC32 때문에 여전히 평등의 lots_of_text 필드를 확인해야 고유 한 값을 생성하지 않습니다 -하지만 기껏 몇 행이 동일한이 때문에 쿼리는 여전히 빠른 것 해시시.

이 변형은 처음 50 자 정도를 해시로 사용하는 것이므로 동일한 처음 50 자의 행 수가 매우 낮습니다.

+0

text_hash = CRC32 ("많은 문자가 많이 있습니다")와 lots_of_text = "많은 문자가 많이 있습니다"; - thx, 해시에 텍스트를 추가로 사용하는 것이 좋습니다. – Riz