今天在生产预备完成10点后执行表新增,多了个心眼,让DBA看一下新增字段语句是不是有影响。因为生产数据库数据实在太多了,不敢随意的新增字段以及索引。
mysq新增字段ddl
ALTER TABLE kohala_ucs.t_single_extra MODIFY personal_sign varchar(256) NULL DEFAULT '' COMMENT '个性签名';
DBA看过后只说了一句,256修改为255,然后晚上10点后执行。我当时在想,我一直建表都是32,64,128,256,512,1024长度,为何要255呢。只能去网上搜搜为何?
先抛出官网答案:
In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte length prefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes, two length bytes if values may require more than 255 bytes.
简单翻译一下就是
char, varchar类型的值,会有一个长度标识位来存值长度。
当定义varchar长度小于等于255时,长度标识位需要一个字节;
当大于255时,长度标识位需要两个字节
也就是说,当我们定义一个varchar(255)的字段时,其实它真实使用的空间是256(255+1)字节;(注意,字段非空,latin1编码)
当我们定义一个一个varchar(256)字段时,它真实使用的空间是258(256+2)字节
我们DBA给的答复是:
因为超过256会申请额外的空间,进行全表锁表,然后进行新增字段,故在高并发的情况下,肯定会影响数据库性能。
现在大家明白了为何要设置255了吧