《高性能MySql》四.Schema与数据类型优化

选择优化的类型

1.尽量使用可以正确存储数据的最小数据类型

2.简单数据类型的操作通常需要更少的CPU周期,例如:整型比字符操作代价更低,因为字符需要校验。应该使用mysql内建的类型而不是字符串来存储日期和时间。

3.TIMESTAMP只使用DATETIME一半的存储空间,并且会根据时区变化,具有特殊的自动更新能力。TIMESTAMP允许的时间范围要小得多。

4.整数类型:TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT

5.实数类型:在数据量比较大的时候,可以考虑使用BIGINT代替DECIMAL,将需要存储的货币单位根据小数的位数乘以相应的倍数即可。

6.字符串类型

(1)Varchar和Char是两种最主要的字符串类型。

(2)存储方法跟存储引擎的具体实现有关。

(3)varchar类型用于存储可变长字符串,它比定长类型更节省空间,因为它仅使用必要的空间。

(4)char类型是定长的,适合存储很短的字符串,或者所有值都接近同一个长度,例如:cahr非常适合存储密码的md5值,因为这是一个订长的值。对于经常变更的数据,char也比varchar更好,因为定长的char类型不容易产生碎片。char(1)存储一个字节,varchar(1)却需要两个字节。

(5)char读取时会截取末端空格

(6)char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10,除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。

(7)Blob和Text都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符串存储

(8)当Blob和Text值太大时,InnoDB会使用专门的“外部”存储区域来进行存储,此时每个值在行内需要1-4个字节存储一个指针,然后在外部存储区域存储实际的值。

7.日期和时间类型

(1)Mysql能存储的最小时间粒度为秒,但是Mysql也可以使用微秒级的粒度进行临时运算

(2)DateTime: 能保存大范围的值,从1001年到9999年,精度为秒,它把日期和时间封装到格式YYYYMMDDHHMMSS的整数。使用8个字节存储空间

(3)TimeStamp: 保存1970年以来的秒数。使用4个字节存储。范围比datetime小得多,回显受时区影响

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

(5)存储微秒级:可以使用Bigint类型存储微秒级的时间戳。

8.位数据类型

(1)mysql把bit当作字符串类型,而不是数字类型。当检索bit(1)的值时,结果是一个包含二进制0和1值的字符串,而不是ASCII码的0或1 。

9.选择标识符

(1)整数类型:整数通常是标识列最好的选择,因为它们很快并且可以使用Auto_increment

(2)字符串类型:如果可能,应该避免使用字符串类型作为标识列,因为消耗空间,并且通常比数字类型慢。如果存储UUID值,则应该移除“-”符号;

10.特殊类型数据

(1)低于秒级精度的时间戳

(2)IPv4地址,人们经常使用varchar(15)列来存储IP地址。然而,实际上是32位无符号整数,不是字符串。所以应该用无符号整数存储IP地址。mysql提供inet_aton 和 inet_ntoa函数用于转换。

MySql schema设计中的陷阱

1.太多的列

(1)Mysql的存储引擎api工作时需要在服务器层和存储引擎层之间通过行缓冲格式拷贝数据,然后服务器层将缓冲内容解码成各个列。从行缓冲中将编码过的列转换成行数据结构的操作代价是非常高的。

2.非此发明的null

(1)避免使用null,并且建议尽可能地考虑替代方案。即使需要存储一个事实上的“空值”到表中时,也不一定非得使用null.也许可以使用0,某个特殊值,或者空字符串为代替。

范式和反范式

1.范式含义: 符合某种级别的关系模式的集合。表示一个关系内部的各属性之间联系的合理化程度。可以理解为:数据表的表结构所符合的某种设计标准的级别

2.范式化:需要关联表,很少或没有重复数据

3.反范式化:所有数据存储在同一张表

缓冲表和汇总表

加快alter table操作的速度

1.mysql的alter table操作的性能对大表来说是个大问题。执行大部分修改表结构操作的方法是用新的结构创建一个空表,从旧表中查出所有数据插入新表,然后删除旧表。这样操作可能需要花费很长时间。 在大部分情况下,它都会锁表并且重建整张表。

2.只修改.frm文件而不涉及表数据。所以,这个操作是非常快的。

3.为了高效地载入数据到表中,有一个常用的技巧是先禁用索引,载入数据,然后重启启用索引。

猜你喜欢

转载自blog.csdn.net/weixin_42763504/article/details/85395579