一、数据库设计的三大范式
1.表中字段不可再分割;
2.必须有主键,非主键列完全依赖于主键;
3.在2的基础上,非主键之间不能存在依赖。
二、存储引擎
(一)常见的存储引擎
InnoDB,MyIsAM,Archive,Memory等。只有InnoDB支持事物。
(二)InnoDB和MyIsAM的比较
(三)事物
1.原子性:指事物执行要么成功要么失败。
2.一致性:指事物提交前后数据保持一致。例如转账,甲乙二人金额总数是一致的。
3.隔离性:事物提交过程中不受其他事物的干扰和影响。
4.持久性:事物提交后会落盘到磁盘中持久化。
(四)常见的现象
1.脏读:指事物执行过程中读取到其他事物还未提交的数据;
2.不可重复度:事物中的两次查询结果中的数值不一致,强调同一行数据的差异;
3.幻读:事物中的两次查询结果中的数据不一致,强调结果中的行数发生变化。
(五)事物的隔离级别
1.读未提交:会发生脏读、幻读和不可重读读的问题;
2.读已提交:会发生幻读和不可重复读的问题;
3.可重复读:会发生幻读问题;
4.可串行:不会发生上述问题。
隔离级别越高,并发效率越低。大部分数据库的默认隔离级别为读已提交,而mysql默认隔离级别为可重复读。在5.0之前的mysql的默认隔离级别也是读未提交,这和mysql的主从一致性有关。5.0版本之前,mysql的bin log文件的存储格式为statment,只记录对数据库的修改操作,不记录其他操作,导致主从一致性方面做的很差,数据经常不一致,因此隔离级别发生变化。
三、索引
(一)B+树与B树的区别
1.b+树非叶子结点仅包含关键字信息,b-树所有节点都有一个指针;
2.b+树叶子结点存储有索引和数据信息,b-树所有节点都有索引和数据信息;
3.b+树的叶子结点之间使用双向链表连接,是有序的,方便范围查找。
(二)索引类型
聚族索引和非聚族索引。(聚族索引又称为主键索引,主键索引要求不能为null,不能重复)
单列索引、组合索引、唯一索引(唯一索引要求值唯一,但允许有null值,例如手机号)
(三)使用索引的建议
区、左、*、联,算、串、模、排
1.索引必须要有区分度;
2.索引设计需要符合最左匹配原则;
3.尽量能不select *就不使用select *,能明确的字段尽量写清楚;
4.尽量多使用联合索引加快查询效率;
5.索引字段中不能有运算,包括加减乘除等;
6.索引中不能包含字符串和数字的模糊匹配;
7.尽量少使用模糊查询;比如like,%张这种查询;
8.排序尽量使用索引字段。
(四)explain--sql性能分析神器
1.通过explain分析可获知那些信息?
访问类型type、可能存在的索引、实际命中的索引、查询了多少行、执行时间。
2.type:
system > const > eq_ref > ref > range > index > all
system:表中只有一条数据;
const:通过索引一次就查到了数据;
eq_ref:索引只有一条数据匹配;
ref:索引有多条数据匹配;
range:查询到给定范围的数据;
index:索引失效;
all:全表查询。
sql语句最低要求要达到range级别,尽可能达到ref级别。
(五)大表如何优化
策略:1.限定查询范围(只能查半年内的聊天记录等);
2.读写分离;
3.分库分表,垂直水平拆分;等
四、mysql的日志
主要包括查询日志、事物日志、bin log 等,比较重要的是bin log和redo/undo log。
1.bin log:二进制日志文件。是数据库级别的日志文件,主要记录对表的修改操作(划重点:表、修改)。主要用于恢复数据和同步数据。bin log文件中数据的存储格式有三种,分别是statment、row和mix。
2.redo log:InnoDB存储引擎级别的日志文件,用于记录事物的操作,可保证数据的完整性。
3.undo log:相当于一个版本控制工具,记录了redo log数据以及表中数据的不同版本。可利用它实现事物的回滚操作。
五、mysql架构
一条数据库语句从客户端传到DB服务端的大致流程:
六、mysql并发策略
1.乐观锁
2.悲观锁
3.行锁
4.表锁
5.页锁
6.时间戳
7.redis分布式锁