2009-08-10 2 views
0

나는 하나의 열이 테이블의 여러 행을 그룹화하는 데 사용되는 일종의 id 문자열 인 테이블을 가지고있다. 열 이름이 '지도'이고지도의 값 중 하나가 예를 들어 "월마트". 특정지도에 속하는 행을 필터링하기 때문에 열에 인덱스가 있습니다.MYSQL은 동일한 문자열이 여러 행에 저장되어있는 경우 최적의 방법으로 저장합니까?

나는 그런지도가 많고 다른지도 값이 표에서 얼마나 많은 공간을 차지하는지 알지 못합니다. MYSQL은 여러 행에 동일한 맵 값이 저장되어 있다는 것을 인식하고 내부적으로 한 번만 저장하며 내부 숫자 ID 만 사용하여 참조합니다.

또는 맵 문자열을 숫자 ID로 명시 적으로 바꾸고 테이블 크기를 줄이려면 다른 테이블을 사용하여 맵 문자열을 ID와 페어링해야합니까?

답변

4

MySQL은 데이터가 이미 다른 행에 존재하는지 여부에 관계없이 모든 행에 대해 전체 데이터를 저장합니다.

제한된 옵션 세트를 사용하는 경우 ENUM 필드를 사용할 수 있습니다. 그렇지 않으면 이름을 다른 테이블로 가져 와서 결합 할 수 있습니다.

+0

이상한 MYSQL은 할 수 없습니다. 열에 인덱스가 있으므로 값이 여러 번 사용되는지 여부를 알 수 있습니다. 그러면 옵션을 살펴볼 것입니다. –

0

MySQL은 매번 콘텐츠를 복제 할 것이라고 생각합니다. 달리 명시 적으로 지정하지 않는 한 데이터를 행 단위로 저장합니다 (제안 된 것처럼 다른 테이블에 데이터를 넣음).

다른 테이블을 사용하여 당신은 당신의 쿼리의 일부에 조인 추가해야 의미합니다 : 당신은 당신의 데이터 의 크기에 대해 조금 생각 할 수 있습니다 (그들에게 그렇게 큰입니까?)(소형에 비해 ?) 그 조인 때문에 발생할 수있는 성능 손실.

또 다른 해결책은 최소한 어떤 문자열을 미리 테이블에 가지고 있는지 알고있는 경우 ENUM 데이터 유형을 사용하는 것이며, 그 중 일부 문자열 만 사용할 수 있습니다.

마지막으로, 다른 해결책은 문자열에 해당하는 정수 "코드"를 저장하고 응용 프로그램에서 문자열을 해당 데이터베이스로 완전히 변환하거나 (해당 테이블을 사용하여 관계를 저장하지만 SQL 쿼리에서 조인을 사용하는 대신 응용 프로그램에서 캐시하는 테이블).
성능이 좋지 않을 수도 있지만 성능면에서는 좋을 수도 있습니다. 여전히 귀하의 경우에는 필요하지 않은 마이크로 최적화 일 수 있습니다 ...

0

값을 반복해서 사용하면 디스크 공간 고려 사항과는 별도로 별개의 테이블로 옮길 수있는 좋은 기능적 이유가 있습니다. 일관성이없는 데이터로 인한 문제를 방지하려면.

StoreName에 대한 열을 포함하는 Stores 테이블이 있다고 가정합니다. StoreName의 값 중 "WalMart"는 300 번 발생하고 "BalMart"가 있습니다. 그것은 단지 "WalMart"의 오타입니까, 아니면 다른 가게입니까?

체인을 통해 상수가 될 수있는 상점과 관련된 다른 데이터가있는 경우 반복해서 저장하지 말고 한 번만 저장해야합니다.

물론지도에 위치를 표시하고 실제로 그 위치를 신경 쓰지 않는다면 표시 할 이름 일뿐입니다.이 위치는 모두 관련성이 없습니다.

그런 경우 더 큰 디스크를 구입하는 것은 레코드 당 몇 바이트를 저장하기 위해 데이터베이스를 다시 설계하는 것보다 간단한 솔루션 일 것입니다.왜냐하면 우리가 여기에 장소 이름에 대해 임의의 문자열을 말하고 있다면, 복제본을 찾고 룩업을 시도하는 것은 거의 이득을 얻지 못할 가능성이 많기 때문입니다.