第一范式:属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)
第二范式:满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。(主属性即主键;完全依赖是针对于联合主键的情况,非主键列不能只依赖于主键的一部分)
第三范式:满足第二范式;且不存在传递依赖,即非主属性不能与非主属性之间有依赖关系,非主属性必须直接依赖于主属性,不能间接依赖主属性。(A -> B, B ->C, A -> C)
BCNF(BC范式) 它构建在第三范式的基础上,如果关系模型R是第一范式,且每个属性都不传递依赖于R的候选键 (其他非主键字段),那么称R为BCNF的模式。
4NF:满足3NF,消除表中的多值依赖PS:
满足BCNF的关系模式,肯定也满足3NF;同理,满足3NF的关系模式,肯定也满足2NF
面向的对象: 数据库 和 表(逻辑结构、表结构、视图、索引)
关键字: create、alter、drop、truncate(删除当前表再新建一个相同的表)
面向的对象: 表、字段
语句顺序:select (distinct)…from…join…on…where…group by…having…order by…limit
执行顺序:from…on…join…where…group by…having…select(distinct)…order by…limit
where和having的区别:
1.WHERE子句用来筛选 FROM 子句中指定的操作所产生的行,在执行分组之前进行应用;GROUP BY子句用来分组 WHERE 子句的输出;HAVING子句用来从分组的结果中筛选行,在执行分组之后进行应用。
2.where子句中的条件表达式having都可以跟,而having子句中的有些表达式where不可以跟;having子句可以用集合函数(sum、count、avg、max和min),而where子句不可以。
3.where可以用于select、update、delete和insert语句中;having只能用于select语句中。
面向的对象: 记录(行)
关键字: insert、update、delete
注意:
开发中很少使用delete,删除有物理删除和逻辑删除,其中逻辑删除可以通过给表添加一个字段(isDel),若值为1,代表删除;若值为0,代表没有删除。
此时,对数据的删除操作就变成了update操作了。
truncate和delete的区别:
truncate是删除表,再重新创建这个表。属于DDL,delete是一条一条删除表中的数据,属于DML。
面向的对象: 用户、权限、事务。
关键字: grant,revoke
事务处理语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION、COMMIT和ROLLBACK。
它的语句,像DECLARE CURSOR、FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。
聚集索引、覆盖索引、组合索引、前缀索引、唯一索引等,没有特别说明,默认都是使用B+树结构组织(多路搜索树,并不一定是二叉的)的索引。**主键索引
索引列中的值必须是唯一的,`不允许有空值`。
普通索引
MySQL中基本索引类型,没有什么限制,`允许`在定义索引的列中`插入重复值和空值。`
全文索引
只能在文本类型CHAR,VARCHAR, TEXT 类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,
在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。
唯一索引
索引列中的值必须是`唯一`的,但是`允许为空值`。
空间索引
MySQL在5.7之后的版本支持了空间索引,而且支持`OpenGIS`几何数据模型。
MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。
前缀索引
在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。
其他(按照索引列数量分类)
1. 单列索引
2. 组合索引: 组合索引的使用,需要遵循最左前缀匹配原则(最左匹配原则) 。一般情况下在条件允许的情况下使用组合索引替代多个单列索引使用。
被索引的列会自动进行排序,包括【单列索引】和【组合索引】,只是组合索引的排序要复杂一些。如果按照索引列的顺序进行排序,对应order by语句来说,效率就会提高很多。过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法使用。
(>、<、between、like)都会停止匹配。
ps:创建的索引列都存在,Mysql的优化器会自动给你排序。
表记录太少
300w数据时MySQL性能就开始下降了,这时就可以开始优化了。
经常增删改的表
提高了查询速度,同时却会降低更新表速度,如对标进行INSRERT、UPDATE、DELETE
因为更新表时,MySQL不仅要保存数据还要保存一下索引文件
where条件里用不到的字段不创建索引
这个就涉及到索引和数据结构了,类比书籍的目录页,索引通过B+树的结构存放数据,横向数据多,纵向的高低越低,和磁盘交互就越少,查询得速度就越快。
原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。
如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
隔离性(Isolation):一个事务的执行不能对其它事务形成干扰。 即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性(Durability):也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。 接下来的其它操作或故障不应该对其执行结果有任何影响。
你知道的越多,你不知道的就越多