mysql类型设计_mysql字段类型设计原则

更小的通常更好

一般情况下,应该尽量选择使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为它们站用更小的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少。

简单就好

简单数据类型的操作通常需要更少的CPU周期。

例如,整形比字符串操作代价更低,因为字符集和校对规则(排序规则)使字符串比整形比较更复杂。这里有两个例子:一个是应该使用MySQL内建的类型而不是字符串来存储日期和时间,另一个是应该使用整形存储IP地址。

尽量避免NULL

通常情况下最好指定列为NOT NULL,除非真的需要存储NULL值。因为查询中包含可以NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、统计索引和值比较都更为复杂。同时,可为NULL的列被索引时,每个索引记录需要一个额外的字节。一般,把可为NULL的列改为NOT NULL带来的提升比较少。

(1)整数类型

TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT分别使用8、16、24、32、64位存储空间,它们可以存储的值的范围从-2(N-1)到2(N-1)-1,其中N是存储空间的位数。

(2)实数类型

FLOAT使用4个字节、DOUBLE使用8个字节、DECIMAL使用9个字节。因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用DECIMAL。

(3)字符串类型

这里主要讲CHAR和VARCHAR。

VARCHAR类型用于存储可变长字符串,是最常见的字符串类型。它比定常更省空间,因为它仅使用必要的空间。但是VARCHAR需要使用1或2个额外字节记录字符串的长度。VARCHAR节省了存储空间,所以对性能也有帮助。

以下情况使用VARCAHR是合适的:字符串列的最大长度比平均长度大很多;列的更新很少,所以碎片不是问题;使用了像UTF-8这样复杂的字符集,每个字符都是使用不同的字节数进行存储。

注意,在使用VARCHAR时最好的策略时只分配真正需要的空间。因为更长的列会消耗更多的内存,MYSQL通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序或操作时特别糟糕,在利用磁盘临时表进行排序时也同样糟糕。

(4)BLOD和TEXT类型

BLOD和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。

MYSQL对BLOD 和TEXT列进行排序与其他类型是不同的;它只对每个列的最前max_sort_length字节而不是整个字符串做排序。如果只需要排序前面一小部分字符,则可以减少max_sort_length的配置,或者使用ORDER BY SUBSTRING(column,length)。

MYSQL不能将BLOD和TEXT列全部长度的字符串进行索引,也不能使用这些索引消除排序。

(5)日期和时间类型

MYSQL提供两种类似的日期类型:DATETIME和TIMESTAMP。

DATETIME这个类型能保存更大范围的值,从1001年到9999年,精度为秒,与时区无关。使用8个字节的存储空间。

TIMESTAMP类型保存了从1970年1月1日(格林尼治时间)以来的描述,它和UNIX时间戳相同。TIMESTAMP只使用4个字节的存储空间,因此它的范围比DATETIME小得多,只能表示从1970年到2038年。

如果在多个时区存储和访问数据,TIMESTAMP和DATETIME得行为将很不一样。前者提供得值跟时区有关系,后者则保留文本表示得日期和时间。

除了特殊行为之外,通常也应该尽量使用TIMESTAMP,因为它比DATETIME空间效率更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值