1、事务四大特性
原子性:要么执行,要么不执行
隔离性:所有的操作全部执行完以前其他会话不能看到执行过程
一致性:执行前和执行后,数据库都处于一个一致性的状态,比如数据总额是一致的
持久性:一旦事务提交,对数据的改变是永久的
2、数据库隔离等级
数据库可能出现下面的问题:丢失修改、脏读(一个进程读取了另外一个进程未提交的数据)、不可重复读(两次读取同一行,前后数据不一样)、脏读(两次检索结果,对应的结果集合不同)。脏读和不可重复读的区别在于,脏读下结果集合有发生结构性的变化,比如多了一行,少了一行;而不可重复读下的结果集合并没有发生结构性变化。
数据库的隔离等级:读未提交、读已提交、可重复读、串行化
3、Mysql两种存储引擎的区别
myisam:不支持事务、表锁、不支持行锁、不支持外键
innodb:支持事务、支持行锁、支持外键
4、哈希索引和B+树索引
哈希索引在查询单值(一行)的时候效率是很高的,都是O(1),但是数据库中经常出现的操作时范围查找,排序查找,而这个时候哈希索引的时间复杂度就退化成O(n)了。而B+树索引的时间复杂度一直是O(log n),非常稳定。
5、聚簇索引和非聚簇索引
(1)聚簇索引:数据行的物理顺序和某一列的逻辑顺序是一致的。一个表上一般只有一个聚集索引。一般会在主键上创建聚集索引。如果你创建表没有指定索引的话,innodb会在主键上创建聚集索引。非聚集索引:数据行的物理顺序和某一列的逻辑顺序是不一致的。一个表上可以有多个非聚集索引。
(2)数据库中索引是用B+树的形式来表现的,聚集索引的叶子节点上存储的是数据行;而非聚集索引的叶子节点上存储的还是索引,只不过里面包含了一个指针,指向真正的数据行。所以,非聚集索引可能会面临二次查询的问题,就是你如果查了两个列的值,一个列并不是非聚集索引,那次是就需要查第二次,去真正的数据行。所以聚集索引的查询效率一般会高于非聚集索引。
6、索引的优缺点,什么时候使用索引,什么时候不能使用索引
加快查询速度,加快排序速度
索引也是要占空间的
索引会影响写的速度,会加快读的速度
频繁查询的列可以建索引,频繁更新的列不适合建立索引
7、索引的底层实现
线性表:查找效率是O(n)
二叉查找树:查找效率是O(log n),最坏情况下查找效率退化成O(n)
平衡二叉查找树AVL:查找下来是O(log n),平衡操作非常严格,需要耗费大量的时间在调整上
红黑树:不严格的平衡二叉查找树,查找效率是O(log n),平衡操作较AVL树有了效率上的提升
B树:红黑树最大的缺点在于它是一个二叉树,如果用在数据库中的话,会导致树的高度非常高,从而影响查找性能。而B树是一个多路分叉查找树,所有的叶子节点都在同一高度。因为分的叉多了,所以B树的高度降低,查找性能就上来了,但也是O(log n)的时间复杂度。
B+树和B树的区别:(1)首先都是多路查找树,其次叶子节点都在同一高度上; (2)B树的非叶子节点会存储索引+真实的数据;而B+树的非叶子节点不存储真实的数据,所有的真实数据都放在叶子节点上。这就导致了B树的查找性能是不稳定的,而B+树对于每一个数据值它的查找性能都是稳定的。另外因为B+树的非叶子结点只存储索引,所以读取一个节点(B+树的节点通常设计成是一个page的大小,操作系统局部性原理+磁盘预读操作,每次会读一个page大小的数据)的时候可以获得更多的索引值,也就是说B+树的IO效率是高于B树的。(3)B+树的叶子结点维护了一个双向的链表,这样就可以支持范围查找了,而且遍历这个数据可以直接遍历这个链表就可以了,不用再遍历整个树了。
8、Sql优化
有索引要走索引
对多个字段进行等值查询时,可以建立联合索引
子查询变成left join
9、数据库的主从复制
异步复制:master开启一个线程,来将binlog日志传递给slave;slave开启两个线程,一个线程接受binlog内容将其写到slave的中继日志中。另一个线程执行中继日志中的sql语句。
半同步:master把binlog的内容都写到slave的中继日志中,master才返回操作完成的反馈。
并行:slave多个线程去请求binlog日志。
10、数据库三大范式
列不可再分
主键唯一确定一行
只有主键才可以做外键
11、 MySQL的整体架构图
12、mysql中sql语句的执行顺序
建立连接
发送sql语句
查询缓存
sql解析器解析sql语句,生成解析树,验证是否符合语法规则
sql优化器将解析树转成执行过程,一个解析树可能对应多个执行过程,sql优化器会选择一个它认为最优的(但有时候sql优化器认为的最优并不是DBA人为的最优,所以这块还有可以人为优化的空间)。