Mysql学习笔记

关系型数据库

三大范式

1NF

要求数据表的每一列都是不可分割的原子项数据

2NF

需要确保数据表中的每一列都与主键相关,而不能只与主键的一部分相关

3NF

确保数据表中的每一列都与数据库直接相关而不是间接相关

ACID

ACID是指DBMS在写入或者更新资料过程中,为保证事务是正确可靠的所具备的四个特性。

Atomicity 原子性

InnoDB:由undo log日志来保证,记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql。

Consistency 一致性

由其他三大特性保证

Isolation 隔离性

由MVCC来保证

Durability 持久性

InnoDB:由内存+redo log来保证,MySql在修改数据时同时在内存和redo log记录这次操作,宕机时可以从redo log恢复

B树和B+树

B-tree,是一种多路搜索树

B+树

是B-Tree的升级版本,在B-Tree上做了一些优化或者改变

最小锁单元

InnoDB:行
MISAM:表

字符集选择

字符集规定了字符在数据库中的存储格式,比如占用多少空间,支持哪些字符等。不同的字符集有不同的编码规则,某些情况下还有校对规则的存在。如果选择不恰当,可能会影响数据库性能,或者导致数据乱码。

索引

索引是数据库表中对数据进行排序的数据结构,会占用额外的磁盘空间,使用索引可快速访问数据库中的信息,是一种用空间换时间的数据结构。
Mysql中索引按照数据结构分类有:B+树索引、哈希索引、全文检索索引(倒排索引,InnoDB1.2.x支持)。
按物理存储分类有:聚簇索引和非聚簇索引。
按字段特性分类有:普通索引,主键索引,唯一索引和全文索引。
按字段个数分类有:单列索引和联合索引。

InnoDB:支持B+树索引、哈希索引(自适应)、全文检索索引(倒排索引,InnoDB1.2.x以及MySql5.6.4后支持)
MyISAM:支持B+树索引、全文检索索引。

B+树索引

聚簇索引

聚簇索引也成为聚集索引,指B+树的叶子节点存放的是表中的所有数据

非聚簇索引

指B+树中叶子存放的不是具体的数据,InnoDB中存放的是对应行的主键,拿到主键后到主键索引中读取(回表),而MISAMM中存放的是索引文件,需要去磁盘中读取数据。

事务隔离级别

隔离级别 脏读 可重复读 幻读 第一类丢失更新 第二类丢失更新
READ-UNCOMMITTED 允许 允许 允许 不允许 允许
READ-COMMITTED 不允许 允许 允许 不允许 允许
REPEATABLE-READ 不允许 不允许 允许 不允许 允许
SERIALIZABLE 不允许 不允许 不允许 不允许 不允许

幻读、脏读、不可重复读和更新丢失

解决方法:加锁、事务隔离和MVCC

脏读

在同一个事务中,读到了其它事务未提交的数据。即在一个事务还没有结束时修改,而此时数据修改还未提交,就被另一个事务求改了该数据而导致最终的结果不一样。

不可重复读(结果不一致)

在一个事务过程中多次查询的结果不一致。即在一个事务进行。即在一个事务进行了一次数据查询,在进行相同条件的查询之前被另一个事务插入删除或者修改了一条记录,导致两次查询的*结果***不同。

幻读(记录数不一致)

在同一个事务中,用同样的操作查询数据,得到的记录数不相同。即在一个事务进行了一次数据查询,在进行相同条件的查询之前被另一个事务插入删除或者修改了一条记录,导致两次查询的*记录数***不同。

第一类更新丢失(撤销)

在A事务撤销时,把B事务修改且已提交的结果覆盖了。

第二类更新丢失(提交)

A事务提交把B事务已提交的结果覆盖了。

解决方案

  1. 根据情况使用设置事务隔离级别。
  2. 还不会

Mysql调优

索引

InnoDB中的索引

InnoDB中的索引有主键索引和辅助索引,InnoDB是聚簇索引方式,因此数据和索引都存放在一个文件里,也就是InnoDB会根据主键作为KEY生成B+树,其叶子节点存放的是主键ID对应的数据。

MISAM索引