mysql-얼마나 많은 열이 너무 많습니까?


111

70 개 이상의 열이있는 테이블을 설정하고 있습니다. 이제 테이블에 액세스 할 때마다 열의 일부 데이터가 필요하지 않으므로 분할을 고려하고 있습니다. 그런 다음 다시 이렇게하면 조인을 사용해야합니다.

어떤 시점에서 너무 많은 열로 간주됩니까?


6
항상 SELECT *를 사용할 필요는 없습니다. 주어진 상황에 필요한 열만 선택할 수있는 옵션이 항상 있습니다.
APC

3
70 열?! 그 중 몇 개가 null 일 수 없습니까?
OMG Ponies

1
큰 질문은 ... 테이블을 정규화하고 있습니까? 70은 성능을 위해 의도적으로 비정규 화하지 않는 한 비정상적인 양입니다 (매우 소수에 70 개의 고유 속성이 있음). 성능을 위해 비정규 화하는 경우 ChssPly76에 동의하여 데이터베이스를 통해 얻을 수있는 모든 것을 사용할 수 있습니다.
Godeke

2
@KM. 그거 농담 이냐? 나는 MySQL을 처음 사용하고 그것을 얻을 수 없습니다. JOIN이 좋은 것 또는 시도하고 피해야 할 것임을 의미합니까?
Elia Iliashenko 2015 년

2
조인이 SQL의 핵심 부분 인만큼 조인을위한 조인은 어떤 응용 프로그램을 사용하든 성능과 유지 관리 성을 저하시킬 수 있습니다.
jeteon

답변:


142

데이터베이스에서 지원 하는 최대 한도를 초과 하면 너무 많은 것으로 간주 됩니다 .

모든 쿼리에서 모든 열을 반환 할 필요가 없다는 사실은 완전히 정상입니다. 이것이 SELECT 문을 사용하여 필요한 열의 이름을 명시 적으로 지정할 수있는 이유입니다.

일반적으로 테이블 구조는 도메인 모델을 반영해야합니다. 실제로 동일한 엔터티에 속하는 70 개 (100 개) 속성이있는 경우이를 여러 테이블로 분리 할 이유가 없습니다.


29
@KM-이것이 내가 "도메인 모델에서 동일한 엔티티에 속하는 속성"이라고 말한 이유입니다. 테이블의 열 수가 많아도 비정규 화되지 않습니다. 중요한 것은 말한 열이 나타내는 것입니다. 게다가 정규화는 확실히 좋은 일이지만 모든 삶의 문제에 대한 해결책은 아닙니다. 트릭 질문-SO 질문 / 답변 옆에있는 투표 수가 select count(*) from votes매번 계산 되는 것으로 생각하십니까, 아니면 비정규 화되었다고 생각하십니까? 그것은 SO 데이터베이스를 나쁘게 만들고 Jeff Atwood를 미치게합니까?
ChssPly76

@ ChssPly76, 개체 모델이 아닌 관계형 데이터베이스입니다. 테이블, 행 및 열이 있으며 최대 성능을 원한다면 해당 제약 조건 내에서 작동하고 성능을 위해 편의를 위해 개체를 모방합니다. 그렇다면 사람에 대한 모든 정보가 동일한 행에 저장되어야합니까? 아니요, 그것들을 나누고 다른 테이블로 그룹화합니다 (이전 의견 양식을 사용하여) : "Person", "Activities" "HealthRecords". 성능상의 이유로 SUM을 저장하는 것은 조인을 피하기 위해 모든 데이터를 70 개의 열에 보관하는 것과는 완전히 다른 문제입니다.
KM.

20
"numberOfTeethPulled"는 개인 레코드의 일부 여야합니까? 아니요, 전혀 저장해서는 안됩니다. 도메인 모델에 이러한 수준의 세부 정보가 필요한 경우 "ToothExtractionRecord"에서 해당 정보를 얻을 수 있습니다. 그러나 그것은 당신의 (그리고 감히 인위적인) 예입니다-그것은 내 요점과 관련이 없습니다. 테이블의 많은 수의 열이 테이블이 비정규 화되었음을 의미하지는 않습니다. 몇 가지 예를 들자면 부동산 계약 / 구매 주문 / 기타 금융 문서를 생각해보십시오. 여러 테이블로 더 나눌 수 있습니까? 예. 그렇게 할 이유가 있습니까? 별로.
ChssPly76

1
+1, 재밌 네요. 다른 테이블을 생성하는 경우 1 : 1 관계가 될 경우 기본 테이블에 포함시켜야합니다. 공간을 절약 할 수는 없습니다. 데이터를 요청하지 않으면 테이블에 전혀없는 것보다 훨씬 더 나은 성능을 발휘하지 못할 것입니다. 등등 SSN, 신용 카드 정보 등이 민감한 정보가있는 경우 지금 나를 위해 마음에 오는 유일한 합법적 인 이유는 ...이다
Vandel212

1
하나의 테이블에 15 개의 열이 있고 다른 테이블에는 300 개의 열이있는 경우 두 테이블의 기본 키는 동일합니다. 두 테이블에서 하나의 열을 선택하면 성능이 크게 달라 집니까?
제안은

28

테이블을 더 적은 수의 열로 여러 개로 분할하면 몇 가지 이점이 있습니다.이를 수직 분할 이라고도 합니다. 다음은 몇 가지입니다.

  1. 행이 많은 테이블이있는 경우 MySQL이 테이블의 모든 인덱스를 다시 작성해야하므로 인덱스를 수정하는 데 시간이 오래 걸릴 수 있습니다. 인덱스를 여러 테이블로 분할하면 더 빠르게 만들 수 있습니다.

  2. 쿼리 및 열 유형에 따라 MySQL은 디스크에 임시 테이블 (보다 복잡한 선택 쿼리에 사용됨)을 기록 할 수 있습니다. 디스크 I / O가 큰 병목 현상이 될 수 있기 때문에 이것은 나쁘다. 쿼리에 이진 데이터 (텍스트 또는 Blob)가있는 경우에 발생합니다.

  3. 테이블이 넓 으면 쿼리 성능이 느려질 수 있습니다.

너무 일찍 최적화하지 마십시오. 그러나 경우에 따라 더 좁은 테이블에서 개선을 얻을 수 있습니다.


5
하나만 수정하면 MySQL이 테이블의 모든 인덱스를 다시 작성해야하는 이유는 무엇입니까?
Petr Peller 2011

나는 같은 것을 궁금해하고 있었다. MySQL이 테이블의 모든 인덱스를 재 구축하는 이유는 무엇입니까? 위에서 언급 한 내용이 맞습니까?
maj

13

정규화 규칙을 위반하면 너무 많습니다. 데이터베이스를 정규화하는 경우 많은 열을 가져 오는 것은 매우 어렵습니다. 특정 db 플랫폼에 대한 최적화에 대한 인위적인 규칙이나 아이디어가 아닌 문제를 모델링하도록 데이터베이스를 설계하십시오.

다음 규칙을 와이드 테이블에 적용하면 단일 테이블에 훨씬 적은 수의 열이있을 수 있습니다.

  1. 반복되는 요소 또는 요소 그룹 없음
  2. 연결된 키에 대한 부분적 종속성 없음
  3. 키가 아닌 속성에 대한 종속성 없음

여기 에 도움 이되는 링크 가 있습니다.


17
It is pretty hard to get that many columns if you are normalizing your database.보기만큼 어렵지는 않습니다.
Petr Peller 2011

5
확실히 그렇게 어렵지는 않습니다. 사람들은 여기이 부분들 주위의 정상적인 형태를 정말로 이해하지 못하는 것 같습니다. 10000 개의 열을 가질 수 있고 여전히 정규화 될 수 있습니다 (가장 높은 정규 형식으로도).
Hejazzman 2013

2
@foljs 그리고 그것이 바로 비정규 화의 허용 된 관행이 들어오는 곳입니다. 만약 당신이 교차로에 있고 차가 당신을 향해 운전하려고한다면, 빛이 녹색으로 변할 때까지 기다리는 것은 어리석은 일입니다. 당신은 비켜 야합니다. 빨간불을 통과하는 것은 기술적으로 합법적이지 않을 수 있지만 상황 = 비정규 화를 감안할 때 당연히해야 할 일을하고 있습니다
user3308043 2014-08-27

3
당신은 자동차에 대해 이야기하기 시작했을 때 나를 잃었습니다. 관련성이 무엇인지 전혀 모릅니다.
JohnFx 2015-06-05

2
그러나 단일 데이터 테이블을 사용하여이 시나리오에서 복잡한 쿼리를 수행하는 방법은 무엇입니까?이 작업을 수행하려면 프로그래밍 언어 및 기타 다양한 항목에 크게 의존해야합니다! 따라서 170 개의 열이있는 테이블로 돌아가는 것이 좋습니다. "JOIN"쿼리와 별도의 테이블을 작동시키는 데 필요한 추가 복잡한 프로그래밍이 시간 낭비처럼 보이기 때문입니다. 나는 KISS 원칙의 열렬한 팬이라고 생각합니다.
Vlad Vladimir Hercules

0

모든 속성이 동일한 엔티티에 속하고 서로 의존하지 않는 한 문제가되지 않습니다. 삶을 더 쉽게 만들기 위해 JSON 배열이 저장된 하나의 텍스트 열을 가질 수 있습니다. 매번 모든 속성을 얻는 데 문제가 없다면 분명히. 이것은 RDBMS에 저장하는 목적을 완전히 무너 뜨리고 모든 데이터베이스 트랜잭션을 크게 복잡하게 만들 수 있습니다. 따라서 데이터베이스 전체에서 따르는 것은 권장되지 않는 접근 방식입니다.


0

동일한 테이블에 너무 많은 열이 있으면 복제에도 큰 문제가 발생할 수 있습니다. 마스터에서 발생하는 변경 사항이 슬레이브에 복제된다는 점을 알아야합니다. 예를 들어 테이블에서 하나의 필드를 업데이트하면 전체 행이 w가됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.