四、Schema与数据类型优化

四五六章 讨论 逻辑设计、物理设计和查询执行,以及它们之间的相互作用

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索引

猜你喜欢

转载自blog.csdn.net/u011028179/article/details/85633453