2014-10-19 1 views
5

대 진 우리는 다음과 같다 테이블이 있다고 가정 : 바이트에 민감한 비교를 수행하려면MySQL byte-for-byte 비교가 더 빠릅니까? bin_collate

create table t1(c1 varchar(x)collate utf8mb4_general_ci, index(c1)) 

, 우리는 기본적으로 모든 관련 문자열 후행하지 공간이 할 가정 두 가지 방법 (가, 즉, 모두 padspace-compliant) :

select*from t1 where c1 ='test'collate utf8mb4_bin 

select*from t1 where c1 = binary'test' 

성능에 문제가있는 경우 어느 쪽이 좋을까요?

비 이진 문자 데이터 정렬 인덱스를 사용하는 경우 comparebinary string 또는 이진 데이터 정렬이 더 빠릅니까?

(단지 c1의 이진 동등한를 저장하는 테이블에 새 열을 추가 스토리지에 가능하지 대박입니다.)

해시 및 BTREE 비교 둘을 비교 답변 감사하겠습니다

(PS, 비록 나는 주로 btree 비교에 관심이있다.)

+1

을하고있는 곳이 질문에

select * from t1 where c1 = binary 'test' 

답변 옵션 1 빠른 것입니까? –

+0

성능이 중요한 경우 c1에 색인을 추가하는 것이 개선 될 수 있습니다. 또한, c1은 어떤 종류의 가능한 값을 가질 수 있습니까? 열거 형에 맞을 수 있습니까? 사전 처리 된 c1 변형을 가진 열을 추가해야합니까? – Ashalynd

+0

숫자가 기발하고 일방적 인 테스트를 사용하여 결론에 도달 할만큼 충분히 가깝습니다. @Ahalynd, 색인은 이미'utf8mb4_general_ci'입니다. 사용자가 임의의 문자, 심지어 중국어 문자를 입력 할 수 있지만 저장된 값은 "영어 단어"입니다. – Pacerier

답변

0

테이블에 인덱스가 있으므로, 바이너리 매칭을 위해 상수는 바이너리를 사용하고 열은 바이너리가 아니다. 이것은 두 가지 옵션보다 빠를 것입니다. 당신은 당신이 무엇을 발견, 지금까지의 테스트에서

WHERE c1 collate utf8mb4_bin='test' 
+0

팁 주셔서 감사합니다. 오른쪽에 캐스팅을 넣으라는 질문을 업데이트했습니다 (왼쪽과 반대). 따라서 두 경우 모두에 대해 오른쪽에 캐스팅을 수행하면 바이너리 문자열로 더 빠르게 캐스팅되거나 바이너리 데이터 정렬로보다 빠르게 캐스팅되고 있습니까? – Pacerier

+0

좋아 .. 좋아.이 경우에는 데이터 정렬이 빨라질거야. 하지만 'test'(후행 공백 포함)와 같은 값을 제외하고 이진을 선호하므로 이진을 선호합니다. 그러나 '테스트'를 포함 시켜서 데이터 정렬을 계속 수행하는 것이 요구되는 경우 –

+0

문자의 이진 변환은 varchar 값의 조합 된 이진보다 많은 공간이 필요합니다. 이 링크가 도움이 될 수 있습니다. [link] (http://dev.mysql.com/doc/refman/5.0/en/charset-binary-collations.html) –

관련 문제