MySQL如何优化模式与数据类型性能

  

良好的逻辑设计和物理设计是高性能的基石,应该根据系统将要执行的查询语句来设计模式。

反范式的设计可以加快某些类型的查询,单同时可能使另一类型的查询变慢,比如添加计数表和汇总表是一种很好的优化查询的方式,但这些表的维护成本可能会很高。

1。选择优化的数据类型

更小的通常更好。

应该尽量使用可以正确存储数据的最小类型,更小的数据类型通常更快,因为他们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周期更少。

简单就好

更简单的数据类型的操作通常需要更少的CPU周期,例如,整型数字比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较相对整型数字比较更复杂,比如,应使用存浮点数值用储IP地址(inet_aton)

尽量避免空

 MySQL如何优化模式与数据类型性能

通常情况下,最好指定列为NOT NULL。如果查询中包含可为空的列,对MySQL来说更难优化,因为可为空的列使得索引,索引统计和值比较非常复杂,可为空的列会使用更多的存储空间,当可谓零的列被索引时,每个索引记录需要一个额外的字节。但是把可为空的列改成非空带来的性能提升比较小,但如果计划在列上创建索引,就应该避免设计成可为空的列。

1.1整数类型

整数类型占用空间范围TINYINT8 SMALLINT16(2 ^ 7、2 ^ 7 - 1)(2 ^ 15日2 ^ 15 - 1]MEDIUMINT24(2 ^ 2 ^ 23日23-1]INT32(2 ^ 2 ^ 31日还有]BIGINT64 [2 ^ 63, 2 ^ 63 - 1]

整型类型有可选的无符号属性,表示不允许负的值,可以使原本正数的上线提高一倍。有符号和无符号类型使用相同的存储空间,并具有相同的性能。整型之间相互计算,是以64位的BIGINT作为中间类型进行计算的。

1.2实数类型

实数是带有小数部分的数字,可以使用十进制存储比长整型数字还大的整数。

十进制类型用于存储精确的小,数支持精确计算,例如,小数(18日9)小数点两边将各存储9个数字,一共使用9个字节,其中小数点前面的数字使用.DECIMAL最多允许65个数字。

浮点类型在存储同样范围的值时,通常比十进制占用更少的空间,内部计算时采用双作为计算类型。

因为需要额外的空间和计算开销,尽量只在对小鼠进行精确计算时才使用小数,在数据量比较大的时候,可以考虑使用长整型数字代替小数,讲需要存储的货币单位根据小数的位数乘以相应的倍数即可。

1.3字符串类型

varchar

varchar类型用于存储可变长字符串,比定长更节省空间,varchar需要使用1个或2个额外字节记录字符串的长度,如果列的最大长度小于或等于255个字节,则只是用1个字节表示,否则使用2个字节.varchar节省了存储空间,所以对性能也有帮助。但是,由于行是变长的,如果在更新时增加了该边长列的实际存储长度,这就导致需要额外的工作,如果一个行占用的空间增长,并且在页内没有更多的存储空间可以存储,在这种情况下,InnoDB需要分裂页来使行可以放进页内。

varchar使用场合:1。字符串列的最大长度比平均长度大很多,列的更新很少

2。使用了utf - 8这种复合的字符集(每个字符都使用不同的字节数存储)

MySQL在存储和检索时会保留varchar尾部的空格.InnoDB可以把过长的varchar存储为BLOB。

字符

定长字符串,MySQL在存储时会去除char尾部的空格。会造成“,”与“A”产生唯一性冲突。数据如何存储取决于存储引擎,填充和截取空格的行为是在MySQL服务层进行的。

更长的列会消耗更高的内存,MySQL通常会分配固定大小的内存来保存内部值,尤其是使用内存临时表进行排序或操作总是会特别糟糕。

BLOB

采用二进制的方式存储,没有排序规则和字符集。包含tinyblob, BLOB, mediumblob, longblob

文本采用字符串的方式存储,有排序规则和字符集,包含非常小的文本串,文本,简单归量变。

与其他类型不同,MySQL把每个BLOB值和文本值当作一个独立的对象处理,存储引擎在存储时通常会做特殊处理,当BLOB和文本值太大时,InnoDB会使用专门的“外部“存储区域来存储,在原本的行中使用指针指向外部的存储区域。同事这两种数据格式最多只能建立前缀索引。

ENUM

枚举不推荐使用(想了解可以参考原书)

1.4日期和时间类型

DATETIME和时间戳

现在推荐使用DATETIME,范围更大,与时区无关,占用8个字节

MySQL如何优化模式与数据类型性能