在mysql数据库表中大多数未使用的大型列是不好的做法?

时间:2015-08-18 05:57:34

标签: mysql

我有一个MySQL数据库表,它有100多列。我必须再添加两列,如果用户输入,则将文本数据保留在其中,但几乎不使用。

现在我的问题是,如果我将其设为"medium text"大小的列并且大多数用户不输入它会发生什么。该列是否仍然占用给定的内存,或者只有当用户输入时,才会分配内存。

我对此并不了解,所以任何解释都是受欢迎的。如果还有其他更好的方法,也请告诉我。

3 个答案:

答案 0 :(得分:4)

即使不经常使用大文本或blob,也可以使用大文本或blob,但尝试使用最适合您需求的最小数据类型。

  • TEXT需要N个字符+2个字节
  • MEDIUMTEXT需要N个字符+3个字节
  • LONGTEXT需要N个字符+4个字节

请参阅:https://dev.mysql.com/doc/refman/5.7/en/storage-requirements.html

此外,如果您允许它们为NULL(假设您使用的是具有COMPACT行格式的InnoDB引擎),则每行每列只使用1位。因此,如果您有2个NULL,它仍将使用1个字节。

NULLs所需的空间= CEILING(N / 8)个字节其中N是一行中的NULL列数。

更多信息:https://dev.mysql.com/doc/refman/5.7/en/innodb-physical-record.html

另一方面,拥有那么多列可能并不理想。尝试将表重组为几个表。

答案 1 :(得分:2)

我认为您需要将这些信息拆分为三个表格。一个包含有关条目的一般信息,一个包含字段列表,另一个包含第一个和第二个表之间的关系。

[Product]
ID | name | model | price

[Fields]
ID | field_name | field_key | is_mandatory

[Field_to_product]
field_id | product_id | value

Field_to_product中,您只持有这些值,该产品具有。

更新时Field_to_product删除该产品的所有条目并重写其值。

答案 2 :(得分:1)

如果列上的数据长度少于65,535个字符,则应考虑使用varchar,而不是文本类型变体。

blob,text,varchar和varbinary数据类型是指针类型。 它们只存储1-2个字节的指针头,并且数据部分将以动态方式获取空间。当数据填充在列中时,它们会分配空间。创建类型(例如varchar(N))时的N部分用于验证目的。

Blob和二进制文件与text和varchar的不同之处在于数据库引擎使用索引进行排序和使用匹配算法来比较数据的方式。 将使用字符集的排序规则存储和比较基于文本的位置。数据库引擎在物理中存储字符的方式由字符集定义。一些字符集如日语或中文,需要双字节存储,而拉丁字符使用单个数字。等等。 Blob和二进制数据按原样保存,不引用任何字符集。

除数据类型外,您应该考虑规范化表格。

https://en.wikipedia.org/wiki/Database_normalization

具有100列的表将随着数据行的增长而降低性能。 在搜索,插入和更新表格时,需要花费更多时间。

您可以从sql查询控制台尝试sql实用程序语法来显示表状态

show table status from your_table_name;

表的实际大小不仅由数据类型定义,而且还来自索引(s),key(s)。索引可以在列集上定义,因此可以在单个表上创建多个索引。 如果使用在该列上启用全文索引的文本数据类型列,则空间要求也将呈指数级增长。