您的位置:首页 > 数据库 > MySQL

《高性能MySQL》第四章

2015-09-09 16:15 513 查看
由于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命令对唯一索引无效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: