高性能MySQL学习笔记(四)

数据库结构优化的目的
1、减少数据冗余
2、尽量避免数据维护中出现更新,插入和删除异常
插入异常:如果表中的某个实体随着另一个实体而存在
更新异常:如果更改表中的某个实体的单独属性时,需要对多行进行更新
删除异常:如果删除表中的某一实体则会导致其他实体的消失
3、节约数据存储空间
数据库结构设计的步骤
1、需求分析: 全面了解产品设计的存储需求
存储需求
数据处理需求
数据的安全性和完整性
2、逻辑设计:设计数据的逻辑存储结构
数据实体之间的逻辑关系,解决数据冗余和数据维护异常
3、物理设计:根据所使用的数据库特点进行表结构设计
关系型设计库:Oralce、SQLServer、Mysql、postgresSQL
非关系型数据库:mongo、Redis、Hadoop
存储引擎: 推荐Innodb

   4、维护优化:根据实际情况对索引、存储结构等进行优化

数据库设计范式 (具体情况要根据业务来定)
数据库设计的第一范式:
数据库表中的所有字段都只有单一属性
单一属性的列是由基本的数据类型所构成的
设计出来的表都是简单的二维表
数据库设计的第二范式:
要满足第一范式的要求
要求一个表中只具有一个业务主键,也就是说符合第二范式的表中不能存在非主键列只对部分主键的依赖关系。
数据库设计的第三范式:
要满足第一、第二范式要求
指每一个非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主属性对主键的传递依赖
什么叫做反范式化设计
反范式化是针对范式化而言的,所谓的反范式化就是为了性能和读取效率的考虑而适当的对数据库设计范式的要求进行违反,而允许存在少量的数据冗余,换句话来说反范式化就是使用空间换取时间
范式化设计的优缺点:
优点:
可以尽量的减少数据冗余
数据库更新快 体积小
范式化的更新操作比反范式化更快
范式化的表通常比反范式化更小
缺点:
对于查询需要多个表进行关联
更难进行索引优化
反范式化设计的优缺点:
优点:
可以减少表的关联
Innodb对全表扫描使用 顺序I/O ,关联操作时随机I/O
可以更好的进行索引优化
缺点:
存在数据冗余及数据维护异常
对数据的修改需要更多的成本
物理设计涉及的内容:
定义数据库、表及字段的命名规范
数据库、表及字段的命名要遵守可选性原则
数据库、表及字段的命名要遵守表意性原则
数据库、表及字段的命名要遵守长名原则
选择合适的存储引擎
存储引擎 事务 锁粒度 主要应用 忌用
MyISAM 不支持 支持并发插入的表级锁 SELECT、INSERT 读写操作频繁
MRG_MYISAM 不支持 支持并发插入的表级锁 分段归档、数据仓库 全局查找过多的场景
Innodb 支持 支持MVCC的行级锁 事务处理 无
Archive 不支持 行级锁 日志记录,只支持insert,select 需要随机读取,更新,删除
Ndb_cluster 支持 行级锁 高可用性 大部份应用
为表中的字段选择合适的数据类型
当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或者二进制类型,最后是字符类型,对于相同级别的数据类型,应该优先选择占用空间小的数据类型
如何选择正确的整数类型
tinyint 1字节 -128-127 有符号 0-255 无符号
smallint 2字节 -32768-32767 0-65535
mediumint 3字节 -8388608-8388607 0-16777215
int 4字节 -2147483648-2147483647 0-4294967295
bigint 8字节 -9223372036854775808-9223372036854775807
0-18446744073709551615
如何选择正确的实数类型
float 4个字节 不精确
double 8个字节 不精确
decimal 每四个字节存9个数字,小数点占一个字节 精确
如何选择VARCHAR和CHAR类型
VARCHAR类型的存储特点
varchar 用于存储变长字符串,只占用必要的存储空间
列的最大长度小于255则占用一个额外字节用于记录字符串长度
列的最大长度大于255则要占用两个额外字节用于记录字符串长度
VARCHAR长度的选择问题
使用最小的符合需求的长度
varchar(5)和varchar(200)存储‘MySQL’ 字符串性能不同
VARCHAR的使用场景
字符串列的最大长度比平均长度大很多
字符串列很少被更新
使用了多字节字符集存储字符串
CHAR类型的存储特点
CHAR类型是定长的
字符串存储在CHAR类型的列中会删除末尾的空格
CHAR类型的最大宽度为255
CHAR类型的使用场景
CHAR类型适合存储所长度近似的值
CHAR类型适合存储短字符串
CHAR类型适合存储经常更新的字符串列
如何存储日期数据
DATETIME类型
以YYYY-MM-DD HH:MM:SS[.fraction] 格式存储日期时间
datetime=YYYY-MM-DD HH:MM:SS
datetime(6) = YYYY-MM-DD HH:MM:SS.fraction
DATETIME类型与时区无关,占用8个字节的存储空间
时间范围1000-01-01 00:00:00 - 9999-12-31 23:59:59
TIMESTAMP类型
存储了由格林尼治时间1970年1月1日到当前时间的秒数
以YYYY-MM-DD HH:MM:SS.[.fraction]的格式显示,占用4个字节
时间范围 1970-01-01 - 2038-01-19
timestamp 类型显示依赖于所指定的时区
在行的数据修改时可以自动修改timestamp列的值
date类型和time类型
存储用户生日时 只存储日期
date类型的优点
1.占用的字节数比使用字符串、datetime、int存储要少、使用date类 型只需要3个字节
2.使用date类型还可以利用日期时间函数进行日期之间的计算
date类型用于保存1000-01-01 到9999-12-31之间的日期
time 类型用于存储时间数据 格式为为HH:MM:SS
存储日期时间数据的注意事项
不要使用字符串类型来存储日期时间数据
日期时间类型通常比字符串占用的存储空间小
日期时间类型在进行查找过滤时可以利用日期来进行比对
日期时间类型还有着丰富的处理函数,可以方便的对日期类型进行日期计算
使用int存储日期时间不如使用timestamp类型
建立数据库结构

如何为innodb选择主键
主键应该尽可能的小
主键应该是顺序增长的
innodb的主键和业务主键可以不同

你可能感兴趣的:(高性能MySQL学习笔记(四))