1、数据库三大范式
每个字段不可再分,不冗余
非主键字段完全依赖于主键
2、drop 删除整张表,不可回滚;delete删除部分数据行;truncate保留表 删除所有数据
3、innodb存储引擎 支持行级锁、表级锁 支持事务 支持异常奔溃后的安全恢复
4、mysql日志文件
错误日志 记录MySQL的启动、运行和关闭过程中的错误信息
慢查询日志 可以帮助开发人员和DBA分析和优化执行效率较低的查询语句,以提升数据库性能
二进制日志 以文本形式的二进制文件存储 记录数据库的所有DDL(数据定义语言)和DML语句(数据操作语言),但不包括SELECT语句。二进制日志以二进制格式记录,可以用于数据恢复、主从复制以及数据变更的回放
重做日志(Redo Log)提交事务的持久化数据 当事务提交时,相关的修改操作会首先被记录到重做日志中,然后才会写入磁盘 是指在数据库的最小存储单元(数据页)上发生的字节级别 的变化
回滚日志(Undo Log) 事务原子性,支持事务回滚
5、sql优化
慢sql监控 慢查询日志、服务监控
直接在 select 语句之前增加 explain 关键字,就会返回执行计划的信息
优化思路------sql语句+数据库设计
避免不必要的列 slect *(尽量避免)
分页优化 回表 是指在使用索引查询时,MySQL 需要回到主表以获取完整的数据行的操作
索引优化 覆盖索引
join优化 尽量使用join语句来替代子查询
6、索引创建的注意点
建在频繁查询的字段上,不建议建在频繁更新的字段上,要对哪些区分度高的字段建立索引,同时控制索引的数量,创建组合索引而不是修改单列索引
索引会提前加载到内存当中,相当于是一个目录
7、B+树的特点
非叶子节点只存储键值,指引搜索方向
叶子节点存储实际的数据
叶子节点之间使用双向指针连接,形成有序链表,方便范围查询和排序
高度相对较低,可以减少I/O操作,提升查询性能
平衡二叉树可是每个节点只存储一个键值和数据的 B+ 树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦**,查询效率就快**
B+树的内部节点只存储关键字,而B树的内部节点需要同时存储关键字和数据。由于B+树内部节点只存储关键字,可以容纳更多的关键字,从而提高了存储容量
B+树的叶子节点形成一个有序链表,使得范围查询操作更加高效。而B树的叶子节点不一定是有序的,需要进行额外的操作才能进行范围查询,更适应范围查询
8、聚簇索引和非聚簇索引
数据存储方式
聚簇 将数据存储与索引放到了一块,非聚簇索引是将数据和索引分开存储,存储了指向聚簇索引的id
覆盖索引不管是单列索引还是联合索引,如果 select 的数据列只用辅助索引中就能够取得,不用去查主键索引,这时候使用的索引就叫做覆盖索引
最左匹配原则 在联合索引 中,如果查询语句只使用了联合索引的一部分 ,那么只有从最左边的索引开始匹配 ,才能使用该索引进行查询
9、mysql事务
原子(undo log)
持久(Redo Log)
隔离 并发控制机制(锁 多版本并发控制)
MySQL的事务有四个隔离级别
- 读未提交------脏读
- 读已提交------不可重复读(针对修改操作,相同查询条件返回不同的结果)
- 默认隔离级别------可重复读 ------幻读(在同一个事务中,由于其他事务的插入或删除操作,对相同的查询条件可能返回不同的结果。)
- 串行化------牺牲并发性能
MVCC 用于解决并发访问下的读一致性问题
- 每个记录都有一个版本链,用于存储历史版本信息
- 每个事务都有一个唯一的事务ID
- 在更新记录时,将当前事务的ID和回滚指针写入新版本,并将新版本添加到版本链的头部。
- 在读取记录时,生成当前事务的Read View,并根据Read View判断哪个版本可见
- 当前事务只能看到在其生成Read View之前已提交的版本和当前事务自己修改的版本。
一致
10、分库分表
垂直分库 业务归属
水平分库