2008-09-22 5 views
20

방금 ​​내 테이블 중 하나에서 "프로 시저 분석"()을 실행했습니다. 그리고이 유형의 INT 열이 있고 0-12 (범주 ID) 값만 포함합니다. 그리고 MySQL은 ENUM ('0', '1', '2', ..., '12')을 사용하면 더 좋을 것이라고 말했습니다. 이 카테고리는 기본적으로 정적이며 향후 변경되지는 않지만, 해당 열을 변경하여 ENUM 목록에 추가 할 수 있습니다 ...ENUM이 INT보다 나은 이유

이 경우 ENUM이 왜 더 나은가?

편집 : 그것은 수있는 값에 대한 제약을 소개하기 때문에 내가

답변

27

간단히 말해서, 그것은 다른 방식으로 색인되기 때문입니다.

이 경우 ENUM은 "이것은이 13 개의 값 중 하나입니다"라고 말하면서 INT은 "정수가 될 수 있습니다."라고 말합니다.

이것은 단순히 "사용"하지 않는 정수에 대한 색인 생성을 고려하지 않아도되므로 색인 작성이 더 쉽다는 것을 의미합니다.

알고리즘과 관련이 있습니다.

나는 INTENUM보다 빠를 점에 이르렀을 때 나는 스스로에게 흥미를 느꼈다.

ENUM에서 숫자를 사용하는 것은 다소 위험 할 수 있습니다 ...이 번호를 SQL에 인용하지 않은 것처럼 보내는 경우 - 잘못된 값을 다시 얻게 될 수도 있습니다!

3

...이의 성능 측면에서 주로 관심이 있어요.

2

저는 MySQL 전문가는 아니지만, 정수는 항상 4 바이트의 공간을 차지합니다. 여기서 enum은 필요한 데이터 범위에 따라 다양한 양의 공간을 차지합니다. 13 개의 항목 만 필요하기 때문에 칼럼에 1 바이트를 사용할 수 있습니다.

+0

1 바이트 정수 (tinyint)를 사용할 수도 있습니다. – Zaffy

1

Oracle에서는 BITMAP 색인이 매우 적은 수의 값에 대한 해시 기반 조회보다 훨씬 빠릅니다. (따라서 쿼리 옵토 마이 제이션이나 인덱스 생성에있어 MySQL과 비슷한 이점이 있다고 생각합니다.)

흥미롭게도 MySQL 문서는 '숫자와 비슷한 것'을 사용하는 것이 ENUM 유형에 나쁜 선택임을 암시합니다. enum 값과 열거 형 인덱스 (http://dev.mysql.com/doc/refman/5.0/en/enum.html).

18

Yikes! ENUM 필드에 숫자를 사용하는 데는 모호한 점이 많습니다. 조심해. 내가 기억하는 한 잡았다는 인덱스로 ENUMS에서 값에 액세스 할 수 있다는 것입니다 : 당신의 열거는 ENUM('A', 'B', 'C', '1', '2, '3') 경우, 다음 두 쿼리는 매우 다르다 :

INSERT INTO TABLE (example_col) VALUES('1'); -- example_col == 1 
INSERT INTO TABLE (example_col) VALUES( 1 ); -- example_col == A 

나는 그것이 유효한 값을 제한하기 때문에 추천입니다 있으리라 믿고있어 테이블에 들어갈 수 있습니다. 예를 들어 13을 삽입하면 기본 선택 항목을 가져와야합니다.

더 나은 선택은 INT 대신 TINYINT을 사용하는 것이 좋습니다. UNSIGNED TINYINT의 범위는 0에서 255까지이며 1 byte to store 만 필요합니다. INT은 4 바이트를 저장합니다. 테이블에 값이 들어가도록 제한하려면 값을 확인하는 ON INSERTON UPDATE 트리거를 추가 할 수 있습니다.

ENUMTINYINT의 성능 차이가 걱정된다면 언제든지 벤치마킹을 통해 차이를 확인할 수 있습니다. This article 다소 관련성이 있습니다.

관련 문제