1.介绍一下事务隔离级别,使用场景和原理?
事务隔离级别:读未提交、读提交、可重复读、串行化。
使用场景:读未提交会出现脏读、不可重复读和幻读。读提交会出现不可重复读和幻读,可重复读会发生幻读。
原理:读提交隔离级别在每次读取数据时,都会生成一个新的Read View。可重复读是在每次事务开始之前都生成一个Read View,所以不会出现事务期间多次读取同一条数据前后两次数据读的不一致的现象。串行化就是在每次事务执行前就给该事务加上锁,该方法最安全但是浪费大量资源,所以一般不会使用该方法。
2.MySQL里面有哪些索引?
单值索引、唯一索引、主键索引、复合索引、前缀索引。
3.MySQL为什么选择B+树作为索引?对比二叉树有哪些优势?
单点查询:B+树的非叶子节点不存放实际的数据,仅存放索引,数据量相同的情况下,B+树的非叶子节点可以存放更多的索引,查询底层节点的磁盘I/O次数会更少。
范围查询:B+树所有叶子节点间有一个链表进行连接,存在大量范围检索的场景,适合用B+树。
插入删除效率:B+树有大量的冗余节点,删除一个节点的时候,可以直接从叶子节点里面删除,甚至可以不动非叶子节点,删除非常快。B+树的插入也是一样,有冗余节点,插入可能存在节点的分裂,但最多只涉及一条树的路径。
B+树对比二叉树:对于有N个叶子节点的B+树,其搜索复杂度为O(logdN),其中d表示节点允许的最大子节点个数。即使数据达到了千万级别,B+树的高度依然维持在3-4层左右,一次数据查询操作只需要3-4次磁盘I/O操作就能查询到。二叉树允许的最大子节点个数为2,意味着复杂度为O(logN),经历的磁盘I/O次数更多。
4.什么是幻读,怎么解决幻读?
幻读就是当事务不是独立执行时发生的一种现象,例如一个事务对表中的某一行数据进行了修改而还未提交,此时另一个事务对表中数据插入修改前的行数据并提交,就会发生像产生了幻觉,没有修改一样,就是幻读。
快照读(普通select语句):使用MVCC实现解决幻读,事务执行中看到的数据一直和事务启动时看到的数据是一样的,此时插入的事务不会被当前的事务读到。
当前读(select...for update):使用记录锁加间隙锁,如果有其它事务在next-key lock锁范围插入了一条记录,那么这个插入语句就会被阻塞,无法插入成功。
5.B树和B+树有什么区别?
- B+树所有关键码都存放在叶节点中,上层的非叶节点的关键码是其子树中最小关键码的复写
- B+树叶节点包含了全部关键码及指向相应数据记录存放地址的指针,且叶节点本身按关键码从小到大顺序连接。
- B树非叶子节点也要存放数据,在相同磁盘IO下,B+树能查询更多的节点。
- B树无法做到基于范围顺序查找,因为叶子节点并没有使用双向链表连接。
6.MySQL的执行引擎有哪些?
- InnoDB引擎提供了对事务ACID的支持,还提供了行级锁和外键的约束。
- MyISAM引擎不支持事务,也不支持行级锁和外键约束。
- Memery就是将数据放在内存中,数据处理很快但安全性不高。
7.MyISAM和InnoDB的区别?
8.介绍一下MVCC?
Read View中有几个重要的字段:
- m_ids:创建Read View时,当前数据库中活跃事务的事务id列表,活跃事务指的是启动了但是还没提交的事务。
- min_trx_id:指的是在创建Read View时,当前数据库中活跃的事务中事务id最小的事务,也就是m_ids的最小值。
- max_trx_id:指的是创建Read View时当前数据库中应该给下一个事务的id值,也就是全局事务中最大的事务id值加一。
- creator_trx_id:指的是创建ReadView的事务的事务id。
对于使用InnoDB存储引擎的数据库表,它的聚簇索引记录都包含下面两个隐藏列。
- trx_id:当一个事务对聚簇索引记录进行改动时,就会把该事务的事务id记录在trx_id隐藏列里。
- rool_pointer:每次对某条聚簇索引记录进行改动时,都会把旧版本记录写道undo日志里面,该隐藏列是一个指针,指向每一个旧版本记录,可以找到修改前的记录。
一个事务去访问记录时,除了自己的更新记录总是可见,还有三种情况(略)。
9.事务有哪些特性?
- A:原子性,每一个事务都是不可再分的最小工作单元,不可能出现事务部分完成的情况。
- C:一致性,事务会从一个一致性的状态转移到另一个一致性的状态。
- I:隔离性,事务没有提交之前,这个事务所做的修改对其他事务是不可见的,
- D:持久性,事务提交之后,事务所做的修改会永久的保存在数据库中。即使系统崩溃也不丢失。
10.介绍以下聚簇索引和非聚簇索引的区别?
聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。也就是InnoDB的主索引节点与数据放在一起,次索引节点存放的是主键的位置。