要点:
CHAR、VARCHAR、INT 数据类型
主键外键设计原则
冷热数据分离概念
长度过大字段的设计
编码问题
字符和字节的区别:1 个字符可以代表一个英文字母/汉字/数字,而 1 个汉字按照编码的不同可以是 2-3 个字节的(大部分英文字母和数字都是 1 个字节)。
UTF-8 是 Unicode 的实现方式之一,Unicode 只是一个字符集。
MySQL 数据类型
CHAR(size):
存储最大 字符 长度为 size 的字符串值(size 取值范围是 0-255),字段占用的 字符 数固定。
这里固定的意思是如果存储的字符串长度小于 size,那 CHAR 会自动用空格补全存入数据库中 (这里的空格不显示)。
VARCHAR(size):
存储最大 字符 长度为 size 的字符串值(size 取值范围是 0-65535),字段占用的 字符 数根据实际值变化。
即如果存储的字符串长度小于 size,VARCHAR 并 不会像 CHAR 那样自动用空格补全字符串。
INT(size):
存储整数值,容易混淆的是 size 所代表的含义,这里的 size 是 指整数显示的宽度,而不是指整数可以存储的最大位数,实际上 INT(10) 和 INT(20) 能存储的数字范围是一样的。
如果设置了一个字段为 INT(5),该字段依然能够存入一个 6 位数的值,且取出的时候也不会将其截断为 5 位;如果存入一个 3 位数的值并且 将字段设置为 ZeroFill ,那么显示该 3 位数值的时候会自动在数字前面补 0。
设计指导方针
CHAR 和 VARCHAR 的选择:
因为 CHAR 无论存储数据长度本身长度多少,都会占用固定的长度,因此存储空间占用会有一定的浪费,而 VARCHAR 由于是可变长度,这个问题就可以得到解决,但在性能上会受到一定的影响, 对于长度基本变化不大,且要求查询速度的应用来讲,CHAR 会更加合适,而 VARCHAR 更节约存储空间。
数据库提取最关键的信息,无关信息(即不需要我方处理的信息)可以直接存到一个 VARCHAR 或者 TEXT 中。需要注意的是为了避免 TEXT 或者过大的 VARCHAR 字段对表的查询性能造成影响,可以把 TEXT 字段重新组织成一张表,原表中只需要存储对应的 id 值即可。
数据冷热分离:
冷数据就是指查询频次较低的数据,热数据就是指查询频次较高的数据。
如果把冷热数据放在同一张表中,那么会导致单表数据量过大,严重影响查询性能,这个时候将冷数据备份到另一张表中可以保证原表的查询性能。
主键外键的设计原则:
主键应该是一个无意义的自增 id,然后将业务上的“主键”设置为唯一索引。如果业务上(逻辑上)的“主键”是由多个字段组成的,那么可以建立 联合索引 。
不能使用外键和级联,所有的相关操作需要在应用层解决。
字段能使用整型的地方就不用字符型。
大型文件(图片)一般都存储在一个独立的文件服务器中,不存在数据库中也不存在服务器本地的文件系统中,比如 CDN。