2014-05-14 5 views
1

여기 새내기. 디자인 질문의 더 많은 것. 그래서 더 나은 성능을 위해 다음과 같은 저장 방법 중 하나를 선택해야합니다. (레코드 유형을 여러 번 확인하는 경향이 있습니다.) MySQL 데이터베이스의 대규모 데이터 세트를 다루는 중MySQL 성능 튜닝

1) 두 개의 열 - 유형 중 하나 기록 (VARCHAR (11)), 값 (INT (11))

eg: type="one", value= 12 

2 ) 열을 병합하고 값 실현 가능성이 보인다 접근

eg: value="one_12" 

전에 유형을 앞에 추가? 당신의 도움을 주셔서 감사합니다.

+1

두 번째 방법은 [원 자성] (http://en.wikipedia.org/wiki/First_normal_form#Atomicity)의 원칙을 위반하므로 1NF입니다. –

답변

3

접근 방식 1은 레코드 유형을 여러 번 쿼리 할 때 유용합니다. 데이터에서 레코드 유형을 추출하기 위해 문자열 연산을 수행해야 할 때마다 접근 방식 2에서 성능 문제가 발생합니다.

4

분명히 첫 번째 변형입니다. 두 번째 것은 데이터 구조화 및 관계형 데이터베이스에 대한 아이디어를 없애줍니다. 데이터베이스 normalization에 대해 읽는 것으로 시작하십시오.

1

접근 번호 1을 권합니다. 아마도 유형을 사실 테이블에 저장하고이를 원시 데이터에 결합 할 것입니다. 그렇다면 작은 정수 값을 저장하기 위해 더 큰 테이블을 저장하는 데 필요한 저장 공간이 훨씬 적어지며 사실 테이블에 가입하는 것이 매우 효율적이고 빠를 것입니다 ((value, type)에 인덱스를 만들었다 고 가정 할 때). 나는 다음과 같은

데이터 테이블 같은 것을 권하고 싶습니다 즉

: ID, 데이터, 더 많은 데이터를 type_value

유형 테이블 : type_value 입력

인덱스 유형 (type, type_value)에 대한 색인 (복합 일명 다중 열)을 사용하는 표. 그런 다음 가입 색인을 활용할 수 있습니다 (예 :

SELECT a.* 
FROM data AS A 
INNER JOIN type AS b 
ON a.type_value = b.type_value 
WHERE b.type = ? 

)이 명령은 MySQL의 복합 색인에서 중요합니다. 따라서 목표가 실제로 WHERE b.type = "One"을 평가하는 것이라면 (예 :) 인덱스 (type, value)를 원할 것입니다. 그러면 인덱스 병합을 사용하지 않고도 형식 테이블을 필터링하고 인덱스에서 id 값을 적용 할 수 있습니다.

1

접근법 1이 2보다 우수합니다. 하지만 여기에 정의 된 유형의 목록이 있다면 제 제안이 있습니다.

형식 (int type_id, varchar 형식)에 대한 새 테이블을 만들고 varchar 열의 인덱스를 만듭니다. 실제 테이블에서 외래 키 참조를 사용하십시오. 테이블이 커질 때이를 처리하는 이상적인 방법입니다.