1,数据库三大范式
第一范式:属性的原子性
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。消除主键和其他键的部分依赖。
第三范式:在第二范式的基础上,非主键只依赖主键,不依赖其他的。消除传递函数依赖。
还有一个最牛范式:BC范式
2,mysql有关权限的表有哪些?
3,Mysql的数据类型
还有很多。
常用的就是InnoDB和MyIsam。
InnoDB是mysql的默认引擎。
InnoDB:支持事务,支持外键,自动热备份,支持行级锁,支持哈西索引。
MyIsam:支持表级锁,支持全文搜索。
InnoDB是聚簇索引,MyIsam是非聚簇索引。
(简要说说两种索引区别,聚簇索引存储索引和数据,非聚簇的叶子节点不是数据是指向数据的地址,然后数据还在磁盘里,所以速度慢)
InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。(其实就是索引)
插入缓冲(insert buffer)
二次写(double write)
自适应哈希索引(ahi)
预读(read ahead)
索引是一种数据结构,通常使用B树和B+树。
用于快速遍历查找数据。
1,主键索引:为了保持数据库表与表之间的关系,不允许空
2,唯一索引:每个值不同,允许有一个空
3,联合索引:多个键一起索引,要符合最左前缀原则。
4,聚集索引
5,非聚集索引
6,全文索引
重点看这个。
InnoDB每张表都有一个聚簇索引,用B+树实现。叶子节点存储整行数据。
辅助索引的叶子节点存储主键值,再通过这个主键值查询聚簇索引里的数据。
有最左前缀匹配原则,遇到范围查找,后面的条件就不过去了。
我们通过辅助索引查到主键,再通过聚簇索引查值,就很浪费性能。
使用覆盖索引,通过查找非主键索引获取的数据已经满足,不需要回表去主键查找。
实现的话,就是非主键列的数据联合索引,就可以了。
B树和B+树是多路搜索树,B树节点里有存数据,B+树只在叶子节点存数据。
红黑树是二叉搜索树,不合理。
蛮不错的,但是不支持范围查找。
不可分割的数据库操作序列,要么都执行,要么都不执行。
原子性:事务是最小的执行单元,不可以分割,要么全部执行,要么不执行。
一致性:执行前后,数据保持一致。如你转我200,你少200的同时,我必须多200。
隔离性:并发访问数据库的时候,一个事务不能被其他事务干扰。
持久性:事务提交之后,对数据库的改变是持久的。
原子性和持久性通过redo log(重做日志)日志和undo log(回滚日志)来保证。
隔离性通过MVCC和锁机制来保证。
一致性通过三个性质来保证。
脏读:一个事务读取到了另外一个事务未提交的数据。
不可重复读:在一个事务内,重复读取某个数据的值,得到结果不一样。
幻读:一个事务内,重复查询某符合条件的记录数量,数量不同。
读未提交:不管有没有事务提交,修改就能别其他事务看见。
读已提交:事务提交后,其他事务才能看到新的数据。
重复读:一个事务重复读取,结果不变。
串行化:给记录加上了读写锁,如果出现读写冲突,会等到当前事务结束后,才继续流程。
读未提交:脏读,幻读,不可重复读
读未提交:啥也别加就是。
读已提交:使用快照
InnoDB的事务日志undo log和redo log,自带的开发日志bin log。