오류 코드 1117 열이 너무 많습니다. 테이블의 MySQL 열 제한


36

1699 개의 열이있는 테이블이 있고 더 많은 열을 삽입하려고 할 때

오류 코드 : 1117. 열이 너무 많습니다

이 테이블에는 1000 개의 행만 있습니다. 나에게 가장 중요한 것은 열의 수입니다. 테이블에 제한이 있습니까? 2000 개의 열을 만들고 싶습니다. 가능합니까?


21
좋은 주 님, 도대체. 이것은 데이터베이스 디자인이별로 좋지 않은 것 같습니다. 또는 작업에 잘못된 도구를 사용하고있을 수 있습니다. 데이터베이스 정규화를
Zoredache

12
모니터를 90도 회전시킵니다. 더 심각하게, MySQL (또는 거의 다른 RDBMS)은 많은 열을 위해 설계되지 않았습니다.

11
왜 2000 개의 센서가 2000 개의 컬럼으로 이어져야합니까? 데이터베이스를 재 설계하십시오. 별도의 센서 테이블 또는 무언가를 생성하되, 각 센서를 새 열로 추가하지 마십시오. 그건 믿기지 않을 정도로 잘못된 일입니다.

6
최대 테이블 번호 ... 와우! 아마도 몇 개의 테이블 만 필요할 것입니다. 2000 개의 열 대신 2000 개의 테이블을 만드는 것도 고려하지 마십시오!

2
데이터베이스 정규화 에 대해 읽으십시오 .

답변:


34

2000 개는 물론 20 개의 열로 테이블을 만들어야하는 이유

승인 된 비정규 화 된 데이터는 많은 데이터 열을 검색하기 위해 JOIN을 수행하지 않아도됩니다. 그러나 열이 10 개를 초과하는 경우 데이터 검색 중에 발생하는 문제를 중지하고 고려해야합니다.

2000 컬럼 테이블에 SELECT * FROM ... WHERE가 발생하면 처리 중에 큰 임시 테이블을 생성하고 불필요한 컬럼을 페치 하며 모든 쿼리 에서 통신 패킷 ( max_allowed_packet )이 푸시 될 많은 시나리오를 작성 합니다.

초기에는 개발자로서 DB2가 주요 RDBMS였던 1995 년 회사에서 근무했습니다. 이 회사는 단일 테이블에 270 개의 열과 수십 개의 인덱스가 있으며 데이터 검색시 성능 문제가있었습니다. 이들은 IBM에 문의하여 컨설턴트가이 단일 모 놀리 식 테이블을 포함하여 시스템 아키텍처를 조사하도록했습니다. "다음 2 년 동안이 테이블을 정규화하지 않으면 DB2는 Stage2 처리를 수행하는 쿼리 (인덱싱되지 않은 열을 정렬해야하는 쿼리)에서 실패합니다." 이것은 270 개의 컬럼 테이블을 정규화하기 위해 수조 달러 규모의 회사에 들었습니다. 2000 컬럼 테이블이 훨씬 더 많습니다.

mysql의 관점에서 DB2 Stage2 처리와 비슷한 옵션을 설정하여 잘못된 설계를 보완해야합니다. 이 경우 해당 옵션은

RAM이 TB 인 경우 수백 개가 아닌 수십 개의 열을 보충하기 위해이 설정을 Tweeking하면 효과적입니다.

트랜잭션 격리를 통해 각 SELECT, UPDATE 및 DELETE를 사용하여 많은 열을 보호하려는 MVCC (Multiversion Concurrency Control) 를 처리해야하므로 InnoDB를 사용하는 경우이 문제가 기하 급수적으로 증가합니다 .

결론

나쁜 디자인을 보완 할 수있는 대체품이나 반창고는 없습니다. 미래의 정신을 위해 오늘 그 테이블을 정상화하십시오!


1
이 말을 할 때 회사가 어떻게 할 것인지 상상할 수있었습니다. svn 후크를 추가하거나 개발자가 SQL에서 색인화되지 않은 열을 정렬하지 않도록 요청하는 "DB 모범 사례 지침"을 작성합니다. 대신 자체 대용량 데이터 정렬 알고리즘을 구현하여 응용 프로그램 내에서 정렬을 수행합니다.
Gqqnbig

25

데이터 모델이 올바르게 정규화 된 테이블에 2000 개의 열을 합법적으로 포함 할 수있는 것을 상상하는 데 어려움을 겪고 있습니다.

내 생각에 당신은 아마도 일종의 "빈칸 채우기"비정규 화 된 스키마를 수행 할 것이다. 여기서는 실제로 모든 종류의 데이터를 하나의 테이블에 저장하고 데이터를 별도의 테이블로 나누고 관계를 만드는 대신에 지정된 행에 어떤 "유형"데이터가 저장되는지 기록하는 다양한 필드가 있으며 필드의 90 %가 NULL입니다. 그럼에도 불구하고 2000 열에 도달하고 싶다면 ...

문제의 해결책은 데이터 모델을 다시 생각하는 것입니다. 주어진 레코드와 관련된 많은 키 / 값 데이터를 저장한다면, 그런 식으로 모델링하지 않겠습니까? 다음과 같은 것 :

CREATE TABLE master (
    id INT PRIMARY KEY AUTO_INCREMENT,
    <fields that really do relate to the
    master records on a 1-to-1 basis>
);

CREATE TABLE sensor_readings (
    id INT PRIMARY KEY AUTO_INCREMENT,
    master_id INT NOT NULL,   -- The id of the record in the
                              -- master table this field belongs to
    sensor_id INT NOT NULL,
    value VARCHAR(255)
);

CREATE TABLE sensors (
    id INT PRIMARY KEY AUTO_INCREMENT,
    <fields relating to sensors>
);

그런 다음 주어진 "마스터"레코드와 관련된 모든 센서 항목을 얻으려면을 클릭하면 SELECT sensor_id,value FROM sensor_readings WHERE master_id=<some master ID>됩니다. 해당 레코드에 대한 master모든 센서 데이터와 함께 테이블 의 레코드에 대한 데이터를 가져와야하는 경우 조인을 사용할 수 있습니다.

SELECT master.*,sensor_readings.sensor_id,sensor_readings.value
FROM master INNER JOIN sensor_readings on master.id=sensor_readings.master_id
WHERE master.id=<some ID>

그런 다음 각 센서의 세부 정보가 필요한 경우 추가로 조인합니다.


18

2000 개의 센서가있는 측정 시스템

정규화에 대해 외치는 모든 의견을 무시하십시오-당신이 요구하는 것은 (이상적인 세계에서) 합리적인 데이터베이스 디자인이 될 수 있고 완벽하게 정규화 될 수 있습니다. 매우 비정상적이며 다른 곳에서 지적했듯이 RDBMS는 일반적 으로이 많은 열에 대해 단순히 설계되지 않았습니다 .

MySQL 하드 한계에 도달하지는 않았지만 링크에 언급 된 다른 요인 중 하나가 아마도 더 높은 수준으로 올라가지 못하게하는 것일 수 있습니다.

다른 사람들이 제안했듯이으로 자식 테이블을 사용 하여이 제한을 해결 id, sensor_id, sensor_value하거나 더 간단하게 첫 번째 테이블에 맞지 않는 열만 포함하는 두 번째 테이블을 만들 수 있습니다 (동일한 PK 사용)


1
사실입니다. 데이터와 해당 SQL을 신중하게 처리 할 때 답이 훨씬 뛰어납니다 !!!
RolandoMySQLDBA

3
자식 테이블을 사용하는 것은 "해결 방법"이 아닙니다. 각 센서에 대해 하나의 열을 갖는 것은 단순히 잘못된 (잘못된) 설계입니다. 이는 HR 시스템의 모든 직원에 대해 하나의 열을 갖거나 자동차 모델을 관리하는 DB에 대해 모든 자동차 제조업체에 대해 하나의 열을 갖는 것과 같습니다.
a_horse_with_no_name

11
@a_horse-당신은 내가 타당하다고 의심한다고 가정합니다. 센서의 수는 기본적으로 고정되어 있고, 모두 동시에 읽고, 매번 데이터를 모두 반환 할 가능성이 있습니다. 이 경우 센서 당 하나의 열이 "잘못된"것이 아니며 데이터베이스의 한계를 고려할 때 비실용적입니다. 나는 달리 입증 될 때까지 질문자들이 바보가 아니라고 가정하고 싶다.
잭 더글러스

2
@ 잭 더글러스 : 귀하의 모든 가정이 사실이라면 (각각의 의심의 여지가 있지만) 각 센서 값을 자체 열에 저장하면 장기적으로 문제가 발생할 수 있습니다. "어제와 오늘 사이의 센서 10 ~ 50 및 25 ~ 100의 평균값은 얼마입니까?"와 같은 쿼리는 어떻습니까? 또는 "어느 월요일에 어떤 센서가 가장 높은 판독 값을 보였습니까?" 2000 개의 열로 쿼리를 작성하십시오. 정규화 된 테이블을 사용하면 2000 컬럼 솔루션이 지금 해결하는 것보다 장기적으로 더 많은 문제점을 해결할 수 있습니다.
a_horse_with_no_name

2
물론, 센서가 관련 값을 저장하는 경우-관련이 없다고 가정합니다 (예 : 센서는 기본적으로 다른 위치에서 동일한 것이 아니라 다른 종류의 것을 측정하고 있습니다). 의심 할 여지가 있지만 OP만이 확실하게 알고 있으며 의료 또는 과학 분야에서는 불가능하지 않습니다.
잭 더글러스

15

MySQL 5.0 열 수 제한 (강조 추가) :

테이블 당 4096 열의 하드 한계가 있지만 유효 최대 값은 주어진 테이블에 대해 더 적을 수 있습니다. 정확한 한계는 몇 가지 상호 작용 요인에 따라 다릅니다.

  • 스토리지 엔진에 관계없이 모든 테이블의 최대 행 크기는 65,535 바이트입니다. 스토리지 엔진은이 제한에 추가 제한을 두어 유효 최대 행 크기를 줄입니다.

    모든 열의 총 길이가이 크기를 초과 할 수 없으므로 최대 행 크기는 열 수 (및 가능한 크기)를 제한합니다.

...

개별 스토리지 엔진은 테이블 컬럼 수를 제한하는 추가 제한 사항을 부과 할 수 있습니다. 예 :

  • InnoDB는 최대 1000 개의 열을 허용합니다.

7

먼저 좀 더 화염을 피운 다음 진정한 해결책을 찾으십시오.

나는 이미 당신에게 던져진 불꽃에 동의합니다.

키-값 정규화에 동의하지 않습니다. 쿼리는 끔찍합니다. 성능이 더욱 악화됩니다.

즉각적인 문제 (열 수 제한)를 피하는 하나의 '간단한'방법은 데이터를 '수직으로 분할'하는 것입니다. 예를 들어, 각각 400 개의 열이있는 5 개의 테이블이 있습니다. AUTO_INCREMENT 인 경우를 제외하고 모두 동일한 기본 키를 갖습니다.

아마도 가장 중요한 12 개의 필드를 결정하는 것이 더 좋을 것입니다. '메인'테이블에 넣으십시오. 그런 다음 센서를 논리적으로 그룹화하고 여러 개의 병렬 테이블에 배치하십시오. 올바른 그룹화를 사용하면 항상 모든 테이블에 참여하지 않아도됩니다.

값을 인덱싱하고 있습니까? 그들을 검색해야합니까? 아마 당신은 날짜 시간에 검색?

많은 열을 색인 해야하는 경우-펀트.

몇 개의 색인을 작성해야하는 경우 '기본 테이블에 넣으십시오.

실제 솔루션은 다음과 같습니다 (적용되는 경우) ...

인덱스 된 방대한 센서가 필요하지 않으면 열을 만들지 마십시오! 네, 들었어요 대신 JSON으로 수집하고 JSON을 압축하여 BLOB 필드에 저장하십시오. 많은 공간을 절약 할 수 있습니다. 열 제한 문제가 아닌 하나의 테이블 만 있습니다. 등. 애플리케이션이 압축 해제 된 다음 JSON을 구조로 사용합니다. 맞춰봐? 앱을 원하는대로 센서를 배열, 다중 레벨 항목 등으로 그룹화 할 수 있습니다. 또 다른 '기능'은 개방형입니다. 더 많은 센서를 추가하면 테이블을 변경할 필요가 없습니다. 유연하다면 JSON.

압축은 선택 사항입니다. 데이터 집합이 큰 경우 디스크 공간에 도움이되므로 전체 성능이 향상됩니다.


이것이 실제 최고의 답변입니다. 그가 그렇게 많은 열을 가지고 있지 않다는 것을 연구해야 할 수도 있지만, 받아 들여진 대답이 '하지 말아야한다'는 것은 그 질문에 대한 답이 아닙니다. 이 사람이 실제로 많은 열을 필요로하지 않더라도이 Q를 찾는 다른 사람이 그 많은 열을 필요로하고 실제 답변이 필요합니다.
BoB3K

@ BoB3K-나의 큰 단락은 언급 된 문제에 대한 이용 가능한 정보를 바탕 으로 해야 할 일을 말합니다 . JSON"너무 많은 열"을 피하십시오. 선택한 열을 인덱싱하면 성능이 향상됩니다.
Rick James

3

나는 이것이 빅 데이터의 세계에서 가능한 시나리오라고 생각하는데, 전통적인 선택 유형의 쿼리를 수행하지 않을 수도 있습니다. 우리는 예측 모델링 세계에서 고객 차원에서 수천 차원의 고객을 모델링하는 고객 수준에서이 문제를 처리합니다 (모두 0 또는 1의 값을 가짐). 이러한 저장 방법을 사용하면 같은 행에 위험 요소가 있고 같은 행에 결과 플래그도있을 때 다운 스트림 모델 구축 활동 등이 더 쉬워집니다. 이는 상위 하위 구조가있는 스토리지 관점에서 표준화 될 수 있지만 다운 스트림 예측 모델은 다시 평면 스키마로 변환해야합니다. 우리는 컬럼 스토리지를 수행하는 redshift를 사용하므로 데이터를로드 할 때 1000 컬럼 이상이 실제로 컬럼 형식으로 저장됩니다 ...

이 디자인에는 시간과 장소가 있습니다. 물론. 정규화가 모든 문제에 대한 해결책은 아닙니다.


의견 주셔서 감사합니다. 이미지로 분석하려면 16x16 픽셀의 작은 컬러 이미지라도 0에서 255 사이의 16 * 16 * 3 정수 (RGB 색상을 사용하여 16x16 픽셀 중 하나에서 색상을 나타내는 3 개의 숫자)가 필요합니다. 그것은 단지 데이터를위한 768 개의 열이며, 여기에는 키를 추가해야합니다.
VictorZurkowski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.