总结(五) MySQL

模块一:基础

1,数据库三大范式

第一范式:属性的原子性

第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。消除主键和其他键的部分依赖。

第三范式:在第二范式的基础上,非主键只依赖主键,不依赖其他的。消除传递函数依赖。

还有一个最牛范式:BC范式

2,mysql有关权限的表有哪些?

  • user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
  • db权限表:记录各个帐号在各个数据库上的操作权限。
  • table_priv权限表:记录数据表级的操作权限。
  • columns_priv权限表:记录数据列级的操作权限。
  • host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

3,Mysql的数据类型

还有很多。

模块二:引擎

常用的就是InnoDB和MyIsam。

InnoDB是mysql的默认引擎。

  • InnoDB和MyIsam有什么区别?

InnoDB:支持事务,支持外键,自动热备份,支持行级锁,支持哈西索引。

MyIsam:支持表级锁,支持全文搜索

  • InnoDB和MyIsam索引的区别

InnoDB是聚簇索引,MyIsam是非聚簇索引。

(简要说说两种索引区别,聚簇索引存储索引和数据,非聚簇的叶子节点不是数据是指向数据的地址,然后数据还在磁盘里,所以速度慢)

InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。(其实就是索引)

  • InnoDB引擎的四大特性

插入缓冲(insert buffer)

二次写(double write)

自适应哈希索引(ahi)

预读(read ahead)

模块三:索引

索引是一种数据结构,通常使用B树和B+树。

用于快速遍历查找数据。

  • 索引分类

1,主键索引:为了保持数据库表与表之间的关系,不允许空

2,唯一索引:每个值不同,允许有一个空

3,联合索引:多个键一起索引,要符合最左前缀原则。

4,聚集索引

5,非聚集索引

6,全文索引

InnoDB索引

重点看这个。

  • 聚簇索引/主键索引/聚集索引

InnoDB每张表都有一个聚簇索引,用B+树实现。叶子节点存储整行数据。

  • 辅助索引

辅助索引的叶子节点存储主键值,再通过这个主键值查询聚簇索引里的数据。

  • 联合索引

最左前缀匹配原则,遇到范围查找,后面的条件就不过去了。

  • 回表

我们通过辅助索引查到主键,再通过聚簇索引查值,就很浪费性能。

  • 如何优化回表呢?

使用覆盖索引,通过查找非主键索引获取的数据已经满足,不需要回表去主键查找。

实现的话,就是非主键列的数据联合索引,就可以了。

  • B树,B+树,红黑树

B树和B+树是多路搜索树,B树节点里有存数据,B+树只在叶子节点存数据。

红黑树是二叉搜索树,不合理。

  • 哈希索引

蛮不错的,但是不支持范围查找。

模块四:事务

  • 什么是事务

不可分割的数据库操作序列,要么都执行,要么都不执行。

  • 事务的四大特性:

原子性:事务是最小的执行单元,不可以分割,要么全部执行,要么不执行。

一致性:执行前后,数据保持一致。如你转我200,你少200的同时,我必须多200。

隔离性:并发访问数据库的时候,一个事务不能被其他事务干扰。

持久性:事务提交之后,对数据库的改变是持久的。

  • InnoDB通过什么来保证四个特性?

原子性和持久性通过redo log(重做日志)日志和undo log(回滚日志)来保证。

隔离性通过MVCC和锁机制来保证。

一致性通过三个性质来保证。

  • 事务并发会出现什么问题

脏读:一个事务读取到了另外一个事务未提交的数据。

不可重复读:在一个事务内,重复读取某个数据的值,得到结果不一样。

幻读:一个事务内,重复查询某符合条件的记录数量,数量不同。

  • 事务的隔离级别

读未提交:不管有没有事务提交,修改就能别其他事务看见。

读已提交:事务提交后,其他事务才能看到新的数据。

重复读:一个事务重复读取,结果不变。

串行化:给记录加上了读写锁,如果出现读写冲突,会等到当前事务结束后,才继续流程。

  • 隔离级别出现的问题

读未提交:脏读,幻读,不可重复读

  • 如何实现隔离级别

读未提交:啥也别加就是。

读已提交:使用快照

模块五:日志

InnoDB的事务日志undo log和redo log,自带的开发日志bin log。

正文完