MyISAM и InnoDB ведут себя по-разному в этом отношении по разным причинам.
Например, InnoDB будет разделять дисковое пространство для каждого столбца на диске независимо от того, есть ли в нем данные, в то время как MyISAM будет сжимать таблицы на диске. В случае большого количества пустых столбцов InnoDB будет тратить много места. С другой стороны, InnoDB выполняет блокировку на уровне строк, что означает, что (с оговорками) одновременное чтение / запись в одну и ту же таблицу будет работать лучше (MyISAM выполняет блокировку на уровне таблицы при записи).
Вообще говоря, вероятно, не очень хорошая идея иметь много столбцов в одной таблице, особенно по причинам волатильности. Например, в InnoDB (возможно, также MyISAM?), Для реорганизации столбцов или изменения типов столбцов (т. Е. varchar 128
-> varchar 255
) в середине таблицы требуется перемещение всех данных в столбцах справа. на диске, чтобы освободить (или удалить) место для измененного столбца.
Что касается вашей общей структуры базы данных, лучше стремиться к тому, чтобы максимально возможное количество столбцов было равно not null
, что экономит пространство (вам не нужен нулевой флаг для столбца, и вы не храните пустой данные), а также повышает производительность запросов и индексов. Если для многих записей конкретный столбец будет иметь значение NULL, вам, вероятно, следует переместить его в отношение внешнего ключа и использовать JOIN. Таким образом, дисковое пространство и издержки индекса возникают только для записей, которые действительно содержат информацию.