Код ошибки 1117 Слишком много столбцов; MySQL-столбец в таблице

dba.stackexchange https://dba.stackexchange.com/questions/3972

  •  16-10-2019
  •  | 
  •  

Вопрос

У меня есть таблица с столбцами 1699, и когда я пытаюсь вставить больше столбцов, которые я получаю,

Код ошибки: 1117. Слишком много столбцов

В этой таблице у меня всего 1000 строк. Для меня самое главное - это количество столбцов. Есть ли какие -либо ограничения на таблице? Я хочу создать 2000 столбцов. Это возможно?

Это было полезно?

Решение

Зачем вам создать таблицу с даже 20 столбцами, не говоря уже о 2000 году ???

Конечно, денормализованные данные могут предотвратить необходимость выполнения соединений для извлечения многих столбцов данных. Однако, если у вас более 10 столбцов, вы должны остановиться и подумать о том, что произойдет под капюшоном во время поиска данных.

Если таблица столбцов 2000 года подвергается выбору * из ... где, вы бы генерировали большие таблицы температуры во время обработки, извлечение столбцов, которые не нужны, и создавая множество сценариев, где пакеты связи (max_allowed_packet) будет подтолкнут к грани на каждом запросе.

В свои ранние дни в качестве разработчика я работал в компании в 1995 году, где DB2 был основным RDBMS. У компании была одна таблица, в которой было 270 столбцов, десятки индексов, и у него были проблемы с производительностью. Они связались с IBM и заставили консультантов просмотреть архитектуру своей системы, включая этот монолитный стол. Компании сказали: «Если вы не нормализуете эту таблицу в ближайшие 2 года, DB2 не пройдет по запросам, выполняющим обработку Stage2 (любые запросы, требующие сортировки на неиндексированных столбцах)». Это было сказано много триллионной компании, чтобы нормализовать таблицу колонн 270. Насколько больше таблицы столбцов 2000 года.

С точки зрения MySQL, вам придется компенсировать такой плохой дизайн, установив параметры, сравнимые с обработкой DB2 Stage2. В этом случае эти варианты будут

Требуние этих настройки, чтобы восполнить присутствие десятков, не говоря уже о сотнях колонн, работает хорошо, если у вас есть TBS of Ram.

Эта проблема умножает геометрически, если вы используете InnoDB, так как вам придется иметь дело с MVCC (Multiversion Complornuency Control) Попытка защитить тонны столбцов с каждым выбором, обновлением и удалением с помощью изоляции транзакций.

ВЫВОД

Там нет заменителя или пластыря, которые могут восполнить плохой дизайн. Пожалуйста, ради вашего здравомыслия в будущем, нормализуйте этот стол сегодня !!!

Другие советы

У меня проблемы с воображением всего, где модель данных может законно содержать колонны 2000 в правильно нормализованной таблице.

Я предполагаю, что вы, вероятно, делаете какую -то денормализованную схему «заполнить пробелы», где вы на самом деле храните все различные виды данных в одной таблице, и вместо того, чтобы разбить данные на отдельные таблицы и устанавливать отношения У вас есть различные поля, которые записывают, какой «тип» данных хранится в заданном ряду, а 90% ваших полей являются нулевыми. Даже тогда, однако, хотеть добраться до колонн 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>

А затем дополнительно соединяется, если вам нужны подробности того, что такое каждый датчик.

Это система измерений с датчиками 2000

Игнорируйте все комментарии, кричащие о нормализации - то, о чем вы просите, может быть разумным дизайном базы данных (в идеальном мире) и совершенно хорошо нормализован, это просто очень необычно, и, как указано в других местах RDBMS, как правило, просто не предназначены для этого многих столбцов Анкет

Хотя вы не попадаете в MySQL жесткий предел, один из других факторов, упомянутых в ссылке, вероятно, мешает вам подняться выше

Как предполагают другие, вы можете обойти это ограничение, имея детский стол с id, sensor_id, sensor_value, или, более проще, вы можете создать вторую таблицу, чтобы содержать только столбцы, которые не будут подходить в первом (и использовать один и тот же PK)

MySQL 5.0 Пределы подсчета столбцов (Акцент добавлен):

Существует жесткий предел 4096 столбцов на таблицу, но эффективный максимум может быть меньше для данной таблицы. Точный предел зависит от нескольких взаимодействующих факторов.

  • Каждая таблица (независимо от двигателя хранения) имеет максимальный размер строки 65 535 байтов. Двигатели хранения могут наложить дополнительные ограничения на этот предел, уменьшая эффективный максимальный размер строки.

    Максимальный размер строки ограничивает количество (и, возможно, размер) столбцов, потому что общая длина всех столбцов не может превышать этот размер.

...

Отдельные двигатели хранения могут наложить дополнительные ограничения, которые ограничивают количество столбцов таблицы. Примеры:

  • Innodb разрешает до 1000 столбцов.

Сначала еще немного пылает, затем реальное решение ...

Я в основном согласен с уже брошенным на вас пламенем.

Я не согласен с нормализацией ключей. Запросы в конечном итоге становятся ужасными; производительность еще хуже.

Одним из «простого» способа избежать непосредственной проблемы (ограничение количества столбцов) является «вертикальное разделение» данных. Скажем, 5 таблиц с 400 столбцами в каждом. У всех них будет один и тот же первичный ключ, за исключением того, что он может иметь его Auto_Increment.

Возможно, лучше выбрать дюжину полей, которые являются наиболее важными, поместите их в «основную» таблицу. Затем группируйте датчики каким -то логичным образом и поместите их в несколько параллельных таблиц. При правильной группировке вам, возможно, не придется все время присоединяться к всем таблицам.

Вы индексируете какие -либо значения? Вам нужно искать на них? Наверное, вы ищете на DateTime?

Если вам нужно индексировать множество столбцов - пунт.

Если вам нужно индексировать несколько - поместите их в основной стол.

Вот реальное решение (если оно применимо) ...

Если вам не нужен обширный массив датчиков, не делайте столбцов! Да, ты меня слышал. Вместо этого собирайте их в JSON, сжатие JSON, храните его в поле Blob. Вы сэкономите кучу пространства; У вас будет только одна таблица, без проблем с ограничением столбца; и т. д. Ваше приложение будет растет, а затем использовать JSON в качестве структуры. Угадай, что? Вы можете иметь структуру - вы можете сгруппировать датчики в массивы, многоуровневые вещи и т. Д., Как хотелось бы ваше приложение. Еще одна «функция»-она открыта. Если вы добавляете больше датчиков, вам не нужно изменять таблицу. Json, если гибкий так.

(Сжатие необязательно; если ваш набор данных огромный, он поможет с дисковым пространством, следовательно, общая производительность.)

Я вижу это как возможный сценарий в мире больших данных, где вы, возможно, не выполняете традиционный тип запросов Select *. Мы имеем дело с этим в мире прогнозного моделирования на уровне клиента, где мы моделируем клиента по тысячам измерений (все они имеют значения 0 или 1). Этот способ хранения облегчает деятельность по строительству модели и т. Д. Прогнозирующая модель вниз по течению должна будет преобразовать ее в плоскую схему. Мы используем Redshift, который выполняет столбчатое хранилище, поэтому ваши 1000+ столбцов при загрузке данных фактически хранятся в столбчатом формате ...

Есть время и место для этого дизайна. Абсолютно. Нормализация не является решением для каждой проблемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top