六大范式
- 所有字段明确不可再分
- 表明确不可分割
也就是说表中的非主键字段必须完全依赖主键
若某个字段没有完全依赖主键的关系,则应该拆分为两张表
- 非主键字段之间彼此独立不相互依赖
例如 工号 姓名 职位 工资 其中职位依赖于工号,工资依赖于职位
- 属性不能多值依赖于主键
即多对多关系建立中间表
- 表必须可以分解为较小的表,除非逻辑上拥有与原始表相同的主键
事务
四大特性
- 原子性 :要么全部成功要么全部失败,不存在部分成功的状态
- 一致性 :只有事务开启前状态和事务提交后状态可见,未提交状态对外不可见
- 隔离性 :事务与事务之间相互隔离,互不影响
-
隔离级别
读未提交 (Read Uncommitted)
事务在执行写数据时不允许其他事务一同写数据
事务在执行写数据时可以访问其他事务未提交的数据(可能出现脏读)
- 读已提交 (Read Committed)
事务在执行写数据时禁止其他事务访问未提交状态
事务在执行读数据时允许其他事务对读取的数据进行修改(可能出现不可重复读)
- 可重复读 (Repeatable Read)
事务在执行读数据时禁止其他事物对读取的数据进行修改
事务在执行过程中允许其他事务并发执行(可能出现幻读)
- 序列化执行 (Serializable)
事务禁止并发执行,即同一时刻只能有一个事务执行
Mysql InnoDB 存储引擎的默认隔离级别是 可重复读(Repeatable Read)
传播行为
- PROPAGATION_REQUIRED : 如果当前没有事务就开启事务,否则加入当前事务
- PROPAGATION_NESTED : 如果当前没有事务就开启事务,否则在当前事务内嵌套开启任务
(外部事物出现异常,内部事务也会回滚)
- PROPAGATION_SUPPORTS : 如果当前存在事务就加入当前事务,否则以非事务执行,
- PROPAGATION_MANDATORY : 如果当前存在事务就加入,否则报错
PROPAGATION_REQUIRED _NEW : 无论当前存不存在事务都开启新事务
(内部事务完成后,外部事物出现错误也不会回滚)
PROPAGATION_NOT_SUPPORTED : 以非事务方式执行,如果当前存在事务就把事务挂起
PROPAGATION_NEVER : 以非事务方式执行,如果当前存在事务就抛出异常
索引和SQL优化
索引的分类
主键索引 :数据列不允许重复,不能为null,一个表中只能由一个主键索引
- 组合索引 :由多个列值组成的索引
- 唯一索引 :数据列不允许重复,如果是组合索引,则列值的组合必须唯一
- 普通索引 :基本类型的索引,可以重复,可以为null
- 聚簇索引 :将数据和索引放到一起存储,索引结构的叶子节点保留了数据行
非聚簇索引 :将数据和索引分开存储,索引结构的叶子节点是指向数据的地址
索引覆盖
InnoDB中非聚簇索引中叶子节点存储的都是主键id,也就是说当我们要先先过非聚簇索引找到主键,然后通过聚簇索引找到主键所对应的数据。但并不是所有搜索都会回表查询,当我们只查找非聚簇索引依赖的列和主键时,通过非聚簇索引就可以检索出数据
索引使用及索引级别
使用 explain + 查询语句 根据结果中的 type 字段判断索引是否使用
type值 :system 表只有一行记录(等于系统表),这是const类型的特列
- const 表示通过索引一次就找到了,const用于比较primary key 或者unique索引
system 表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计
const 表示通过索引一次就找到了,const用于比较primary key 或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体。
range 只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between、< 、>、in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引。
index Full Index Scan,Index与All区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘读取的)
all Full Table Scan 将遍历全表以找到匹配的行
SQL优化
- 根据sql语句的执行顺序,条件筛选应尽量放在on上
- 合理利用索引
- 避免全字段查询,应当只查询自己需要的字段
- 避免索引失效(or , like ‘%…’)
- 强制使用索引 force index 索引名
存储引擎InnoDB和MyISAM的区别
| | InnoDB | MyISAM | | —- | —- | —- | | 事务 | 支持 | 不支持 | | 锁 | 支持行锁、表锁(行锁建立在索引上) | 支持表锁 | | 主键 | 必须有,不指定会默认生成隐藏列作为主键 | 可以没有 | | 自增 | 必须包含只有该字段的索引
如果和其他列建立组合索引自动增长列必须是第一列 | 可以和其他字段一起建立联合索引
引自动增长列必须是索引 | | 外键 | 支持 | 不支持 | | 索引 | 利用主键创建的索引为主索引(聚簇索引)
在主索引之上创建的索引为辅索引(非聚簇索引)
辅索引的叶子节点中保存的是主键 | 主索引和辅索引都为非聚簇索引
索引结构的叶子节点上存储的都是指向数据行的地址 | | 优点 | 支持事务、并发量较大、适合大量的update | 适合大量的select | | 缺点 | 查询相对较慢 | 不支持事务、并发量小 |
1 人点赞
1