varchar 2比varchar 255更有效吗?

oro*_*aki 10 mysql database django varchar database-design

我正在使用Django并设置我的CharField(max_length = 255),即使我只打算使用大约5个字符.这效率不高吗?我已经读过它与varchar无关,但后来读到它会节省硬盘空间来仅指定你需要的东西.

Ale*_*ski 12

通常,varchar(255)需要与varchar(1)一样多的存储空间.在每种情况下,表都存储类似指针到字符串表和长度的东西.例如,4字节偏移+ 1字节大小=每行固定5个字节,仅用于开销.

实际内容当然是在字符串表中,它只与您的商店中的字符串一样长.因此,如果您在varchar(255)字段中存储5个字母的名称,它将仅使用(比方说)5个开销字节+5个内容字节= 10个字节.

使用varchar(10)字段将使用完全相同的数量,但只会截断超过10个字节的字符串.


当然,具体数字取决于存储引擎的实现.


Pau*_*xon 5

除了存储字符串长度开销之外,varchar不会占用比存储在其中的字符串更多的空间:

+------------------------------------------+---------------------------------+
| Value      | CHAR(4)    Storage Required | VARCHAR(4)   Storage Required   |  
+------------+-----------------------------+---------------------------------+
| ''         | '    '     4 bytes          | ''           1 byte             |
| 'ab'       | 'ab  '     4 bytes          | 'ab'         3 bytes            | 
| 'abcd'     | 'abcd'     4 bytes          | 'abcd'       5 bytes            |
| 'abcdefgh' | 'abcd'     4 bytes          | 'abcd'       5 bytes            |
+------------+-----------------------------+---------------------------------+
Run Code Online (Sandbox Code Playgroud)

但是,如果确实只需要5个字符,那么如果表中没有其他可变宽度的列(即varchars,text或blob),请考虑使用char(5)。然后,您将获得固定长度的记录,它确实具有一些性能优势

对于经常更改的MyISAM表,应尝试避免使用所有可变长度列(VARCHAR,BLOB和TEXT)。如果该表甚至只包含一个可变长度的列,则使用动态行格式。请参阅第13章,存储引擎。