2011-10-20 4 views
0

나는 수 억 개의 행을 가진 테이블을 가지고 있습니다. 열 중 하나가 `status` varchar(10)입니다.두 개의 동일한 열이있는 MySQL 인덱스

상태의 대부분의 값은 1 자이며 최대 값은 10 자까지입니다. 그러나 값의 서브 세트는 고유 한 패턴을 갖습니다. 상태 값의 전체 그룹은 하나의 문자 c과 0에서 10,000 사이의 숫자로 시작합니다.

ALTER TABLE tbl ADD KEY (status(1), status); 

이 두 개인 키, status(1) (전체 칼럼의 첫 번째 문자)와 두 번째 status에 일을하는 것보다 더 나은 것 :

나는 인덱스에 다음이 열을 싶습니다. 함께하면 항상 더 빨라졌습니다.

그러나 MySQL은 같은 만들기에서 저를 금지 :

ERROR 1060 (42S21): Duplicate column name 'status' 

가 어떻게이 문제를 해결할 수 있습니까?

답변

1

status(1)status과 독립적으로 색인 할 이유가 없습니다. status에 생성 된 하나의 색인은 두 상황을 똑같이 잘 처리해야합니다.

+0

전화 번호부의 각 개인 이름에 대해 색인을 갖는 것처럼 보이는 저에게 - 색인을 데이터베이스로 검색하는 데 비교적 오래 걸릴 것입니다. 이 잘못된 생각입니까? – Mikhail

+0

@Mikhail 예, 그 생각은 잘못되었습니다. 형식에 관계없이'status'를 검색하면 색인을 이용할 수 있습니다. –

+0

나는 그것이 그것을 이용할 수 있다는 것을 이해한다. 당신이 말하는 것은 첫 번째 캐릭터를 찾는 것입니다, 그리고 나머지 가치는 더 빠르지 않습니까? – Mikhail

1

테이블에 두 번째 열을 만들고 다른 열의 첫 번째 문자로 채우고 각각에 인덱스를 만들 수 있습니다. 그러나 이것은 선택성이 좋지 않고 유용하지 않을 수도 있습니다.

+0

나는 그것에 대해 생각했다. 그러나이 새로운 칼럼을 이용하기 위해서 나는 이것을 사용하는 모든 코드를 다시 작성해야만했다. – Mikhail

+1

''c % ''타입을 선택하는 것과 같은 일을한다면, 함께 주문되는 별도의 색인 그러나 마지막 문자를 검색하고 싶다면 두 번째 열에서 분리하는 것과 같은 것이 유용 할 수 있습니다. 왜냐하면'like '의 머리 부분에 %를 사용하면 항목을 모두 검색해야하기 때문입니다. – Poodlehat

관련 문제