2009-11-03 2 views
1

MySQL의 테이블 :MySQL의 인덱싱 된 CHAR (255) 필드 ... 최적입니까? 필드의 부부와 함께

  • id-PRIMARY KEY
  • url - CHAR(255).

url 필드도 고유하고 색인되어 있습니다. 현재이 테이블에 수십만 개의 항목이 있습니다. MySQL은 정말로 느려집니다.

아이디어는 다음과 같습니다. hash BIGINT UNIQUE INDEXED 필드를 추가하고 합성 색인 hash/url을 생성하면 더 빨리 작동할까요? 수단은 MySQL이 먼저 hash/url 쌍을 확인하고 hash을 사용하고 url을 사용합니까? 더 빠를 것인가?

대답이 '예'인 경우 - MySQL의 색인 된 문자열에 어떤 이유로 이것이 투명하게 구현되지 않았습니까?

+0

'url LIKE'% '+ string +'% ''는 색인을 사용하지 않는다는 것을 알고 있습니까? –

+0

글쎄, 실제로 그것은 어떻게 든 색인이 생성되었지만 정확한 일치를 사용하여 선택해야합니다. 그리고 저에게'BIGINT 해시'가 더 잘 작동 할 것입니다. MySQL 내에서 투명하게 구현되지 않은 이유 – Archer

답변

2

해시 BIGINT UNIQUE INDEXED 필드를 추가하고 복합 색인 해시/URL을 만들면 더 빨리 작동할까요? BIGINT 필드에 키 조회가 CHAR 필드에서보다 빠른

은 (놀랍게도, 성능 향상은 키 히트에보다 키 미스에 더 눈에 띈다). 나는 UNIQUE 필드에서 사용을 권장하지 않는 게 좋을

수단은 MySQL이 처음 내 해시/URL 쌍을 확인합니다 왜

참고 그러나 BIGINT 해시 해시 충돌의 매우 높은 확률을 가지고, 그건 해시를 사용하고 URL을?

당신이 (hash, url)에 복합 키를 생성하고 hash이 아니라, 인덱스의 hash 부분에 ref 조건을 사용합니다 검색합니다. 해시에 조회를 수행 Quassnoi

+0

@Quassnoi : 전에이 해시 기법을 사용했습니다. 'md5()','sha1()'또는 다른 것을 제안 하시겠습니까? –

+0

여기에는 암호화 강도가별로 중요하지 않습니다. 'MD4'는 가장 빠르며'MD5'는'MySQL'에 내장되어 있습니다. 그래서'MySQL' 외부의 해시에는'MD5'를,'MySQL' 내부에는 해시를 사용합니다. – Quassnoi

0

하나는 확실히 훨씬 빠른 것이다. 비슷한 스타일 테이블을 만들었지 만 아주 긴 URI를 저장하고 TEXT 유형을 사용해야했기 때문에 합성 키가 거기에 적용되지 않았습니다. URL과 URI는 문자 필드보다 훨씬 길다. 나는 그들을 여러 개의 테이블로 나누어 저장했으며, 심지어 몇 백만 개의 URL 후에도 URL/URI 테이블의 분할을 고려해야했습니다. 대략 :

table hostnames: 
    id int(11), 
    hostname char(255), 
    unique (hostname) 
table uri: 
    id int(11), 
    digest char(33), 
    uri text, 
    unique digest 
table querystr: 
    -- like uri table 
table urls: 
    id int(11), 
    fk_host int(11), 
    fk_uri int(11), 
    fk_query int(11) 
    unique u (id, fk_host, fk_uri, fk_query) 

당신이 잘 작동하지 않습니다 LIKE '%foo%'를 사용하여 자유 텍스트 방식으로 몇 백만 URL 또는 URI를 통해 검색해야하는 경우

. 무거운 검색을 위해 텍스트 검색 중심의 MySQL 확장 또는 Lucene/Solr과 같은 라이브러리를 고려하십시오.

관련 문제