高性能MySQL--第四章 Schema与数据类型优化

1.选择优化的数据类型

通常情况下,应尽量选择可以正确存储数据的最小数据类型。更小的数据类型通常更快,占用更少的磁盘、内存、CPU缓存,处理时需要的CPU更少。

使用简单数据类型。

尽量避免null。最好指定列为NOT NULL。可以为NULL的列的索引、索引统计和值都较复杂,会使用更多存储空间,MySQL需特殊处理。不过设置为NOT NULL对性能提升较小,但是索引列最好避免NULL。而且InnoDB使用单独的位(bit)存储NULL值空间效率很好。

1.1整数类型:整数和实数。整数,TINYINT(8BIT) SMALLINT(16BIT)MEDIUMINT(24BIT)INT(32BIT)BIGINT(64BIT)存储范围-2^(N-1)~2(N-1),N是存储空间的位数。UNSIGNED表示不允许负数,加了此属性,正数的上限提高一倍。实数,存储小数部分的数字,也可以使用DECIMAL存储比BIGINT大的整数。FLOAT和DOUBLE使用标准浮点运算进行近似计算,DECIMAL用于存储精确的小数,可以指定小数点前后允许的最大位数。允许最多65个数字。FLOAT4字节存储,DECIMAL8字节,DECIMAL将数字打包到一个二进制字符串中,每4字节存9个数字(小数点算一个数字),才、需额外的存储和计算开销,对小数进行精确计算时才选用DECIMAL,可以把小数乘以倍数用BIGINT来计算,避免浮点计算的不精确和DECIMAL精确计算代价高的问题。

1.2字符串类型:VACHAR,字符串长度可变,需使用额外的1~2字节存储字符串长度,列的最大长度小等于255使用1字节,否则2字节。CHAR,定长,适合存储端字符串,或长度接近的字符串(如密码的md5值)。VARBINARY和BINARY存储二进制字符串,区别类似于VERCHAR和CHAR,二进制字符串存储字节码而非字符,MySQL里,比较BINARY字符串时,每次按一个字节并根据该字节的数值进行比较,比较操作更简单,处理更快。TEXT和BLOB(二进制的)为存储很大的字符串数据设计,TINYBLOB,BLOB(SMALLBLOB),MEDIUMBLOB,LONGBLOB;TINYTEXT,TEXT(SMALLTEXT),MEDIUMTEXT,LONGTEXT。MySQL将它们当作独立的对象处理,InnoDB使用准们的存储区域进行存储,行内需要1~4字节存储指针,外部区域存储实际的值。BLOB没有排序规则和字符集,TEXT有。ENUM,有时可代替字符串类型,把一些不重复的字符串存储成一个预定义的集合,但是字符串列表是固定的,添加或删除字符串必需用ALTER TABLE,ENUM会根据列表值的数量压缩到1~2个字节中,MySQL会将每个值在列表中的位置保存为整数,并在表的.frm文件中保存数字-字符串的映射关系查找表,可以缩小表的大小。

1.3日期和时间数据类型:DATETIME,从1001到9999,精度为秒日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,8个字节存储。TIMESTAMP,保存从1970年1月1日以来的秒数,和UNIX时间戳相同,使用4字节存储,只能表示1970年到2038年。

1.4位数据类型:底层都是字符串类型。BIT,最大长度64个位,最好避免使用。SET。

存储UUID值,应该移除-,或用UNHEX()函数转换UUID值为16字节的数字,存储在一个BINARY(16)列中,检索时可以通过HEX()函数来格式化为16进制格式。

Ipv4地址实际上是32位无符号整数,应该用无符号整数类型存储。

2.范式:参考:https://blog.csdn.net/wenco1/article/details/88077279

符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度。

1NF的定义为:符合1NF的关系中的每个属性都不可再分

若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。

设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K(这个“完全”不要漏了),那么我们称 K 为候选码,简称为

包含在任何一个码中的属性称为主属性。

2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。

3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

满足BCNF范式的条件如下:

所有的非主属性对每一个码都是完全函数依赖 (暗含 主关键字里面可能有多个码可以将实体区分)
所有的主属性对每一个不包含它的码也是完全函数依赖(即所选码与未选择的码之间也是完全函数依赖的)
没有任何属性完全函数依赖于非码的任何一组属性(即非主属性之间不能函数依赖)
参考:https://blog.csdn.net/qq_43079376/article/details/93647335

1NF: 字段是最小的的单元不可再分
2NF:满足1NF,表中的字段必须完全依赖于全部主键而非部分主键 (一般我们都会做到)
3NF:满足2NF,非主键外的所有字段必须互不依赖
4NF:满足3NF,消除表中的多值依赖

范式化schema的缺点是经常需要关联。

反范式化所有数据都在一张表里,减少关联。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值