《高性能MySQL》Schema与数据类型优化
Schema与数据类型优化
4.1选择优化的数据类型
1.更小的通常更好
更小的数据类型通常更快,因为它们占用更小的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少。
2.简单就好
简单数据类型的操作通常需要更少的CPU周期
3.尽量避免null
通常情况下最好指定列为NOT NULL,除非真的需要存储NULL值。如果查询中包含了可为null的列,对MySQL来说更难优化,因为可为null的列使得索引、索引统计和值比较都更复杂。可为null的列会使用更多的存储空间,在MySQL里也需要特殊处理。当可为Null的列被索引时,每个索引记录需要一个额外的字节,在MyISAM里甚至还可能导致固定打小的索引。如果计划在列上建索引,就应该尽量避免设计成可为null的列。
4.1.1整数类型
有两种类型的数字:整数和实数。整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别是8,16,24,32,64位存储空间。
MySQL可以为整数类型指定宽度,例如INT(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具用来显示字符的个数。对于存储和计算来说,INT(1)和INT(10)是相同的
4.1.2实数类型
FLOAT和DOUBLEL类型支持使用标准的浮点运算进行近似计算。DECIMAL类型用于存储精确的小数。DECIMAL(18,9)小数两边将各存储9个数字。
浮点类型在存储同样范围的值时,通常比DECIMAL使用更少的空间。因为需要额外的空间和计算开销,所以应该只在对小数进行精确计算时才使用DECIMAL——例如存储财务数据
4.1.3字符串类型
VARCHAR用于存储可变长度字符串,是最常见的字符串数据类型。它比定长类型更节省空间,因为它仅用必要的空间。有一种情况例外,如果MySQL表使用了ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储,这会很浪费空间。VARCHAR需要使用1或2个额外字节记录字符创的长度:如果列的最大长度小于或等于255字节,则使用1个字节表示,否则使用2个字节。VARCHAR节省了存储空间,所以对性能有帮助,但是,由于行是变长的,在UPDATE时可能使行变得比原来更长,这就导致做额外的工作。
CHAR类型是定长的:MySQL总是根据定义的字符创长度分配足够的空间。当存储CHAR值时,MySQL会删除的末尾空格。CHAR值会根据需要采用空格进行填充以方便比较。CHAR是和存储很短的字符串,或者所有值都接近同一个长度。CHAR适合存MD5,或者CHAR(1)存Y/N的值。因为定长的CHAR不容易产生碎片。
BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。MySQL把每个BLOB和TEXT值当做一个独立的对象处理。存储引擎在存储时通常会做特殊处理。BLOB和TEXT仅有的不同是BLOB类型存储的是二进制数据,没有排序规则和字符集,而TEXT类型有字符集和排序规则。
4.1.4日期和时间类型
DATETIME保存大范围的值,从1001年到9999年,精度为秒。把日期和时间封装到格式YYYYMMDDHHMMSS的整数中,与时区无关
TIMESTAMP保存1970~2038年,TIMESTAMP显示的值依赖于时区。除特殊行为之外,通常也应该尽量使用TIMESTAMP,因为它比DATETIME空间效率更高。
4.1.5位数据类型
4.1.6选择标识符
4.1.7特殊类型数据
4.2MySQL schema设计中的陷阱
4.3范式和反范式
4.4缓存表和汇总表
4.5加快ALTER TABLE操作的
4.6总结
浙公网安备 33010602011771号