《高性能mysql》二schema与数据类型优化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43928720/article/details/102677408

一、选择优化的数据类型

(1)更小的通常更好
一般情况下,应该尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为他们占用更少的磁盘、内存和cpu缓存,并且处理时需要的cpu周期也更少。
(2)简单就好
简单数据类型的操作通常需要更少的cpu周期。
(3)尽量避免null
通常情况下最好指定列为not null, 除非真的需要存储null值。可为null的列会使用更多的存储空间,在mysql中也需要额外处理。同时,可为null的列被索引时,每个索引记录需要一个额外的字节。

二、选择具体的类型

很多Mysql的数据类型可以存储相同的数据,只是存储的长度和范围不一样,允许的精度不同,或者需要的物理空间不同。
例如, datetime和timestamp列都可以存储相同类型的数据:时间和日期,精确到秒。然而timestamp只使用datetime一般的存储空间,并且会根据时区变化,具有特殊的自动更新能力。另一方面,timestamp允许的时间范围要小得多。

三、数据类型

(1)整数类型
如果存储整数,可以使用这几种整数类型:tinyint,smallint,mediumint,int,bigint,分别使用8、16、24、32、64位存储空间,整数类型有可选的unsigned属性,表示不允许负值,这大致可以使正数的上限提高一倍。不同的类型决定了mysql是怎么在内存和磁盘中保存数据的。然而,整数计算一般使用64位的bigint整数。
mysql可以为整数类型指定宽度,例如Int(11),对大多数应用来说,这是没有意义的:它不会限制值的合法范围,只是规定了mysql的一些交互工具用来显示字符的个数。
(2)实数类型
浮点类型在存储同样范围的值时,通常比decimal使用更少的空间。float使用4个字节存储,double占用8个字节,相比float有更高的精度和更大的范围。和整数类型一样,能选择的只是存储类型,mysql使用double作为内部浮点计算的类型。
因为需要额外的空间和计算开销,所以应该尽量只在对小数进行精确计算时才使用decimal(例如存储财务数据)。在数据量比较大的时候,可以考虑使用bigint代替decimal,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。
(3)字符串类型
varchar
varchar用于存储可变长字符串,它比定长类型更节省空间,因为它仅使用必要的空间,varchar使用1到2个额外的字节记录字符串的长度。
如果一个行占用的空间增长,并且在页内没有更多的空间可以存储,在这种情况下,不同的存储引擎的处理方式是不一样的。例如MyISAM会将行拆成不同的片段存储,InnoDB则需要使用分裂页来使行可以放进页内。
下面这些情况使用varchar是合适的:
字符串列的最大长度比平均长度大很多。
列的更新很少,所以碎片不是问题。
使用了像UTF-8这样复杂的字符集,每个字符都使用不同的字节数进行存储。
使用varchar(5)和varchar(100)存储’hello’的空间开销是一样的、那么使用更短的列有什么优势?
事实证明有很大的优势,更长的列会消耗更多的内存,因为mysql通常会分配固定大小的内存块来保存内部值,所以最好的策略是只分配真正需要的空间。
char
char类型是定长的,mysql总是根据定义的字符串长度分配足够的空间。char适合存储很短的字符串,或者所有值都接近同一个长度。
(4)日期和时间类型
datetime
这个类型能保存大范围的值,从1001年到9999年,精度为秒。它把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关。使用8个字节的存储空间。
timestamp
timestamp保存了从1970年1月1日午夜以来的秒数,它和UNIX时间戳相同。timestamp只使用4个字节的存储空间,因此它的范围比datetime小很多,只能表示从1970年到2038年。timestamp表示的值也依赖于时区。
除了特殊行为之外,通常也应该尽量使用timestamp,因为它比datetime空间效率更高。

四、alter table操作

mysql执行大部分修改表结构操作的方法是用新的结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表。

猜你喜欢

转载自blog.csdn.net/weixin_43928720/article/details/102677408