四五六章 讨论 逻辑设计、物理设计和查询执行,以及它们之间的相互作用
1、选择优化的数据类型
简单原则如下
(1) 更小的通常更好,尽量使用可以正确存储数据的最小数据类型。更小的数据类型更快,因为它们占用更少的磁盘、内存和CPU缓存,并且处理时需要的CPU周期也更少。
(2) 简单就好,简单数据类型的操作通常需要更少的CPU周期。eg:整型比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比整型更复杂。
(3) 尽量避免NULL,通常最好指定列NOT NULL。如果查询中包含可为NULL的列,对MySQL来说更难优化,因为可为NULL的列使得索引、索引统计和值比较复杂。
第一步是确定适合的大类型:数字、字符串、时间等。
下一步选择具体类型
很多MySQL的数据类型可以存储相同类型的数据,只是存储的长度和范围不一样、允许的精度不同,或者需要的物理空间(磁盘和内存空间)不同。也可能有一些特殊的行为和属性
类型 |
大小 |
范围(有符号) |
范围(无符号) |
用途 |
TINYINT |
1 字节 |
(-128,127) |
(0,255) |
小整数值 |
SMALLINT |
2 字节 |
(-32 768,32 767) |
(0,65 535) |
大整数值 |
MEDIUMINT |
3 字节 |
(-8 388 608,8 388 607) |
(0,16 777 215) |
大整数值 |
INT或INTEGER |
4 字节 |
(-2 147 483 648,2 147 483 647) |
(0,4 294 967 295) |
大整数值 |
BIGINT |
8 字节 |
(-9 233 372 036 854 775 808,9 223 372 036 854 775 807) |
(0,18 446 744 073 709 551 615) |
极大整数值 |
FLOAT |
4 字节 |
(-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) |
0,(1.175 494 351 E-38,3.402 823 466 E+38) |
单精度 浮点数值 |
DOUBLE |
8 字节 |
(1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) |
双精度 浮点数值 |
DECIMAL |
对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 |
依赖于M和D的值 |
依赖于M和D的值 |
小数值 |
https://www.cnblogs.com/-xlp/p/8617760.html
1.1 整型
1个字节是8位 存储值范围是 - 2(n-1) ---- 2(n-1)-1
整型有可选的UNSIGNED属性 ,表示不允许负值,使得正数上限提高一倍
1.2 实数型
float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decimal是定点型;
MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示,M表示该值的总共长度,D表示小数点后面的长度,M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999,MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001。
FLOAT和DOUBLE在不指 定精度时,默认会按照实际的精度来显示,而DECIMAL在不指定精度时,默认整数为10,小数为0。
float 4字节 double 8 字节
1.3 字符类型
VARCHAR 与 CHAR的对比
1、VARCHAR用于存储可变长字符串,比定长更节约空间,仅使用必要的空间。
例外,MySQL表使用 ROW_FORMAT=FIXED
需要使用1-2个格外字节记录字符串长度
适合:字符串列的最大长度比平均长度大很多;列的更新少;使用UTF-8每个字符使用不同字节存储。
2、CHAR是定长的,空格填充
适合存储很短的字符串,或者所有值都接近同一个长度,比如md5
对于经常变更的数据,CHAR比VARCHAR更好,因为定长的CHAR类型不容易产生碎片。对于非常短的列,CHAR比VARCHAR在存储空间上也更有效率
BLOB和TEXT类型
BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制 和字符方式存储。BLOB存储二进制数据,没有排序规则或字符集,TEXT有字符集和排序规则
1.4 日期和时间类型
2、MySQL shema设计中的陷阱
(1) 太多的列
(2) 太多的关联
(3) 全能的枚举 注意防止过度 使用枚举
(4) 变相的枚举
(5) 非此发明的NULL
3、范式和反范式
3.1 范式的优点和缺点
好处:
范式化的更新操作通常比反范式化要快
当数据较好地范式化时,就只有很少或者没有重复数据,所以只需要修改更少的数据
范式化的表通常更小,可以更好地放在内存里,所以执行操作更快
很少有多余的数据意味着检索列表数据时更少需要distinct或者group by 语句
缺点:
范式化设计的schema的缺点通常需要关联
3.2 反范式的优点和缺点
反范式化的schema因为所有数据都在一张表中,可以很好地避免关联。
4、加快ALTER TABLE 操作的速度
4.1 只修改.frm文件
4.2 快速创建MyISAM索引