第一范式( 1NF )
数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性
第二范式( 2NF )
第二范式必须先满足第一范式,第二范式要求数据库的每个实例或行必须可以被唯一的区分,即表中要有一列属性可以将实体完全区分,这个属性就是主键
第三范式( 3NF )
第三范式必须先满足第二范式,第三范式要求一个数据库表中不包含已在其他表中已包含的非主关键字信息
第四范式( 4NF )
必须满足第三范式, 表中不能包含一个实体的两个或多个互相独立的多值因子
优点
因为相对来说有较少的重复数据,范式化的更新操作要比反范式快。同时范式化需要更少的distinct和order by
缺点
通常需要关联,不仅代价昂贵,也可能会使的一些索引无效
反范式
1. 复制:在两个表中根据实际业务情况存储部分相同的字段列,即有利于查询,也不会把表搞的太大
2. 缓存:对于需要多次join查询的表,可以在一个表中加入一个缓存列,用来缓存所join表的部分常用数据,如count等,我们需要实时更新该缓存
内连接
只有两个表相匹配的行才能在结果集中出现。返回的结果集选取两个表中所匹配的数据,舍弃不匹配的数据
select fieldlist from table1 [inner] join table2 on table1.column = table2.column
外连接
外连接不仅仅包含符合连接条件的行,而且还包括左表(左外连接),右表(右外连接),或者两个边表(全外连接)中的所有数据行
select fieldlist from table1 left/ right outer join table2 on table1.column = table2.column
查询优化
IN
代替OR
, OR
的效率是n级别,IN
的效率是log(n)级别,IN
的个数建议控制在200以内BETWEEN
不用IN
LIMIT
,同时尽量不用count *
大数据量下的优化
建表时
int
不要用bigint
null
,声明not null
,如果是null
用0代替TIMESTAMP
而非DATETIME
查询时
加缓存NoSQL
分区
分表
垂直分表:把表中的一些字段移到其他表或者新建表
水平分表:和分区类似
垂直分库:把不同数据表分到不同库,不同服务器上
可以使用MyCat等中间件来实现
差异 | MyISAM | InnoDB |
文件格式 | 数据和索引是分别存储的,数据.MYD ,索引.MYI |
数据和索引是集中存储的.ibd |
文件能否移动 | 能,一张表就对应.frm 、MYD 、MYI 3个文件 |
否,因为关联的还有data 下的其它文件 |
记录存储顺序 | 按记录插入顺序保存 | 按主键大小有序插入 |
空间碎片(删除记录并flush table table_name 之后,表文件大小不变) |
产生。定时整理:使用命令optimize table table_name 实现 |
不产生 |
事务 | 不支持 | 支持 |
外键 | 不支持 | 支持 |
锁支持 | 表级锁定 | 行级锁定、表级锁定 |
查询语句
更新语句
先按照上述步骤,分析SQL语句,然后拿到要修改的行
执行器修改拿到的行,同时调用引擎把修改后的行写入表中
引擎将这行数据更新到内存中,同时使redo log进入prepare状态
告知执行器执行完毕,随时可以提交事物
执行器生成操作的binlog,并写入磁盘
执行器调用引擎的提交事物接口,引擎把刚才的redo log改成提交状态,更新完成
原文:https://www.cnblogs.com/byene/p/12677464.html