我们在设计mysql表时经常通过自己习惯,而忘记了为什么要这样设计,以及这样设计有什么优势?
意外之间我发现了这样一张表:

首先提出这张表的问题:(依据是:根据自己日常需求)
1、复合索引创建规则,业务一般使用玩家Id进行查询,此处索引不起作用
2、varchar 长度是越长越好,还是合适?
3、null 和not null 问题
问题一:索引不起作用
创建复合索引注意:
1、索引:提高数据查询的速度,一般创建索引的列为很少改动的列。
2、复合索引满足最佳左前缀原则,会创建以下三个索引(name,age,height)、(name,age)、(name);
3、通过玩家PlayerId 对这张表查询索引会失效
4、参考:https://blog.csdn.net/weixin_30086969/article/details/113089033
问题二:varchar 长度是越长越好,还是合适?
1、 众所周知的,char是定长,而varchar是变长
- char(M)类型的数据列里,每个值都占用M个字节,如果某个长度小于M,MySQL就会在它的右边用空格字符补足.(在检索操作中那些填补出来的空格字符将被去掉)在varchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上一个用来记录其长度的字节(即总长度为L+1字节)。
- 比如 char(20),存储“eee”,占用的还是20个字节
- varchar(20)长度是可变的,比如varchar(20),存储“eee”,占用的是4个字节
- 每次varchar值改变是会计算varchar的长度,但是char是固定长度,省略计算varchar长度步骤,varchar不适合频繁改变的数据
2、varchar在存储的时候,会另加一个字节来记录长度(如果列声明的长度超过255字节,则使用两个字节)
- 设计varchar()值的时候,不要一股脑的都用varchar(255):mysql会把表信息放到内存中(查询第一次后,就缓存住 了,linux下很明显,但windows下似乎没有,不知道为啥),这时内存的申请是按照固定长度来的,如果varchar很大就会有问题。
- 关于varchar(255)和varchar(256) :根据mysql官方文档,varchar(255)需要一个字节记录字段的长度 256以上需要两个字节记录长度。设置长度超过256会有点浪费。
3、varchar(20) 和varchar(2000) 对性能影响:内存影响和磁盘影响,效率影响,在查询速度上varchar(20)比varchar(2000)快
4、因为在业务中使用innoDB多一些,所以尽量还是用varchar好一些
5、参考:# https://blog.csdn.net/liu865033503/article/details/96428486
问题三 null 和not null 问题
1、参考:# https://blog.csdn.net/liu865033503/article/details/96428486
2、其实我们在初学mysql的时候,都会看到一段话,那就是mysql建议字段最好为不要为null,尽量为not null。
尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化。因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
null会影响索引的统计,一般会默认null为同一个值,这样这个索引的筛选价值就降低了,影响优化器的判断。当然也可以调整参数,使得null被认为是不同的值。
3、在mysql中 ' '是不占空间的,而null 需要一个标志为null
4、不使用NULL可以提高索引效率,因为树形索引结构中将NULL也视作一般数据节点
5、在设置默认值的时候,尽量不要用Null来当默认值,如果字段是int类型,默认为0,如果是varchar类型,默认值用空字符串(' ')会更好一些。带有null的默认值还是可以走索引的,只是会影响效率。当然,如果确认该字段不会用到索引的话,也是可以设置为null的
网友评论