三大范式
- 保证每列的原子性。即每一个字段都不能再分割。
- 一张表只描述一件事情。必须满足第一大范式。
- 表中的字段和主键直接关联
范式和性能的问题
- 实际开发考虑商业化的需求和目标(成本、用户体验),性能比规范性更加重要
- 在考虑性能的同时,需要适当的考虑一下规范性
- 故意增加一些冗余字段(为了多表查询变成单表查询)
- 关联查询的表不得超过三张
事务三个特性
原子性、一致性、隔离性、持久性
优化数据库的方法
选取最适用的字段属性
使用连接(JOIN)来代替子查询
建立索引
优化查询语句
优化查询方法
首先看是不是大部分sql都很慢考虑下硬件优化个系统配置优化
- 硬件的优化
分库分表、增加服务器,加大服务器内存 - 系统配置的优化
增大缓存配置、增大数据库连接池 - 数据库表结构的优化
适当冗余数据,减少表连接
适当拆分表,不导致表的列数过多
默认值尽量不是null - SQL语句及索引的优化
等式左侧不用函数
详细介绍
索引的类型
按数据结构分类可分为:B+tree索引、Hash索引、Full-text索引。
按物理存储分类可分为:聚簇索引、二级索引(辅助索引)。
按字段特性分类可分为:主键索引、普通索引、前缀索引。
按字段个数分类可分为:单列索引、联合索引(复合索引、组合索引)。
索引的数据结构(b树,hash)
- b+树索引更适合在><和between,like
- 哈希索引 适合查找单个
索引什么情况下会失效
- 模糊查询以 "%"开头索引失效,因为不确定 % 的值
- 使用复合索引时候不遵循最左原则
- myqsl预估全表查询会比索引快的时候
- 使用 or 的时候会失效,如果使用 or 要求条件两边都要有索引,才会使用索引,如果其中一边有一个字段没有索引,那么另一个字段上的索引也会失效
- 索引列参与了运算
- 字符型字段为数字时在where条件里不添加引号
事务隔离级别
引用
事务隔离级别:读未提交,读已提交,可重复读,串行化
对应问题:赃读,不可重复读,幻读
赃读:A事务查询到B事务修改的数据但是B事务还没提交可能回滚
不可重复读:A事务在B事务修改前后读的不一样
幻读:A事务读取B事务插入的数据但是未提交
回表、覆盖索引
使用innodb搜索引擎有且仅有一个聚集索引,一般默认是主键,如果没有主键就是非null的第一列。聚集索引放有所有列的数据,通过聚集索引查询可以直接查询到所有数据。
事务是如何实现的*

image.png