《高性能MySQL》第四章

由于innodb表索引的特殊性,减小主键大小,会使非主键大小也变的更小。

基于行的二进制日志包含行更新前后的镜像,既有旧的,又有新的。





整数类型
tinyint smallint mediumint int bigint
8       16       24        32   64
取值范围-2power(2,n-1)-1  至 2 power(2,n-1)-1
如果使用unsigned属性,则正数的上限提高一倍。
存储的时候根据类型存储,但计算的时候一般使用64位的BIGINT整数。


实数类型
mysql既支持精确类型,也支持不精确类型。
float和double不精确,decimal精确。
float使用4字节存储
double使用8字节存储,相比float有更高的精度和更大的范围。
计算的时候使用DOUBLE作为内部浮点运算的类型。
浮点类型存储同样范围的值时,通常比decimal占用更少的空间。
浮点存储不精确,decimal存储精确但代价高。所以可以用bigint代替decimal(方法就是把需要存储的小数点后的数字乘以几百几千倍,变成BIGINT类型)
CPU不支持对decimal的直接计算,mysql服务器自身实现了对decimal的高精度计算。相对而言,CPU直接支持的性能更好。




字符串类型(仅讨论myisam和innodb,其他引擎有可能不同)
存储引擎存储char或者varchar值的方式在内存和磁盘上可能不一样,所以mysql服务器从存储引擎读出的值可能需要转换为另一种存储格式。
varchar 
变长存储,只有在ROW_FORMAT=FIXED的时候,才会每一行采用定长存储。
需要1-2个额外字节记录字符串的长度,《=255字节,一个字节表示,否则2个字节表示。
由于update导致行变长,且页内没有空间存储,myisam会将行拆成不同的片段存储,innodb会分裂页。
5以上版本,mysql在存储和检索时会保留末尾空格,但5以下会剔除末尾空格。
innodb会把过长的varchar存储为BLOB。


字符串长度定义不是字节数,是字符数。多字节字符集会需要更多的空间存储单个字符。
填充和截断空格的行为在不同引擎是一样的,因为是在服务器层实现的。


char
固定长度,不宜产生碎片,对于非常短的列,在存储空间上更有效率。
会自动截断末尾空格。前面的空格不会截断。5以上的varchar不会。


varchar(N),N最好最接近需要的值,这样分配内存,排序等操作时效率更好。避免导致悲观的按最大长度分配内存。


BLOB(二进制方式存储)
TEXT(字符方式存储)
与其他类型不同,mysql把每个BLOB和TEXT值当做一个独立的对象处理,而不是行中的某一列。用专门的外部存储区域来存储。行内存储指针。
排序时,只按照最前面max_sort_length字节而不是整个字符串排序。此参数可以修改。也不能用全部长度字符串进行索引。
max_heap_table_size/tmp_table_size  using temporary


ENUM枚举类型,代替字符串类型,存储时保存每个值在列表中的整数,并在.frm文件中保存数字与字符串的映射关系表。排序时按整数排序,而不是字符串。




日期和时间类型
mysql能存储的最小时间粒度为秒。
DATATIME  1001-9999年,精度为秒。8个字节存储,封装为YYYYMMDDHHMMSS的整数。
TIMESTAMP 1970年至今的秒数。4个字节存储,1970-2038年。依赖时区。默认为NOT NULL,这点不同于其他类型。(推荐,因为效率高点。)




主键和外键数据类型不相同时,可能报1005错误,不能创建表。
尽量避免用字符串类型作为主键标识符,因为效率比整数类型差很多。




存储引擎层和服务器层中间有行缓冲。很多变长行结构在这层缓冲,然后转换成行数据结构。
不要关联太多的表,最大支持61个表关联,但最好不要超过12个表。


mysql会在索引中存储null值,但oracle不会。


4.4

有时提升性能可以在同一张表中保存衍生的冗余数据。也可以使用独立的汇总表或缓存表。

mysql并不原生支持物化视图,可以通过其他开源工具实现,包括增量更新等功能。


on duplicate key update 


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

5.1及更新版本包含一些类型的“在线”操作的支持。

一般而言,大部分alter table会在整个过程中锁表,导致业务中断。

替代方法:1.主备库切换 2.影子拷贝

理论上,有时候可以通过修改.frm文件阿里修改表结构。alter column会直接修改.frm文件。


延迟构建索引时,disable keys命令对唯一索引无效。

你可能感兴趣的:(《高性能MySQL》第四章)