字段选择的基本规则
- 更小的通常更好,同类型字段,尽量选择占用更小的存储空间的,更小的字段通常速度更快,因为占用更少的硬盘空间,内存空间和cpu资源。 若tinyint 满足条件 则不选择int
- 简单更好,多个数据类型满足的情况下,选择更简单的类型。更简单的类型可以减少cpu的处理时间。 如数字型会比字符串更加有优势
- 尽量避免null, 如果字段中允许null的话,mysql很难去优化查询,因为所建立的索引会更加复杂
整数型
整数型包含了 tinyint、smallint、mediumint、int 和 bigint,分别是2的8、16、24、32、64位存储空间
signed 和unsigned 使用相同的空间,
int(1)和int(20)是占用一样的空间,并且作用是一样的。只是会在一些mysql的交互工具上显示不同而已。
实数类型
实数型包含float、double、decimal,decimal可以用来存储bigint存储不下的数字
float和double只能提供近似的值,如要存储精确的小数则需要使用decimal来处理
因为decimal占用的空间较大,如数字大小并不大,则可以使用将小数部分乘以百万 转为bigint存储
字符串类型
varchar
varchar是变长字符串,使用1到2位来存储长度,当字符串长度不大于255时使用1位
varchar对性能的提升是因为它是变长的,但当你更新它时需要进行额外的工作
对于varchar 尽量使用符合条件 更短的长度。 长度大时,mysql需要消耗更多的内存去处理,mysql在内部处理时,总是将varchar转为定长字符串。尤其在filesort,临时表和排序时,对性能影响更大
使用场景
- 当字符串的最大长度远大于字符串的平均长度
- 字段的更新很少,频繁的更新会导致页分裂
- 使用复杂的字符集
char
char是定长字符串
使用场景
- 当你存储很短的字符串时,char是非常好用的,例如存储md5后的值
- 存储的值经常需要更新
char会自动将字符串结尾的空格去掉,而varchar则不会
text 和 blob
text和blob可以存储大量的字符串和数字,text具有字符集而blob不具有字符集
text有 tinytext、text、mediumtext和longtext
blob有tinyblob、smallblob、blob、mediumblob和longblob
时间类型
datetime类型
yyyy-mm-dd hh:mm:ss
datetime 类型时间和时区无关 占用8个字节存储空间
timestamp 实际上是以int 1970年-2038年
存储1970年1月1日到当前时间的秒数,以yyyy-mm-dd hh:mm:ss显示,占用4个字节
显示依赖于指定时区
在行修改时,可以自动修改timestamp值
date类型 只用3个字节
只存储日期,可以利用日期时间函数进行计算
time类型
只存储时间数据,hh:mm:ss
不要使用字符串来存储时间日期