1.数据库索引的原理,为什么要用 B+树,为什么不用平衡二叉树?
红黑树多用于内部排序,即全放在内存中
B+树多用于外存上时,B+也被成为一个磁盘友好的数据结构
红黑树和平衡二叉树有相同缺点,每个节点存储一个关键词,数据量大时,导致红黑树的深度很深,mysql每次读取时消耗大量io
2.分库与分表的设计
分库分表方案 :水平分库:以字段为依据,按照一定策略(hash 、 range 等),将一个库中的数据拆分到多个库中。水平分表:以字段为依据,按照一定策略(hash 、 range 等),将一个表中的数据拆分到多个表中。垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。分库分表可能遇到的问题事务问题:需要用分布式事务啦跨节点 Join 的问题:解决这一问题可以分两次查询实现跨节点的 count,order by,group by 以及聚合函数问题:分别在各个节点上得到结果后在应用程序端进行合并。数据迁移,容量规划,扩容等问题ID 问题:数据库被切分后,不能再依赖数据库自身的主键生成机制啦,最简单可以考虑 UUID跨分片的排序分页问题
3.Mysql事务的隔离级别
读未提交( Read Uncommitted )读已提交( Read Committed )可重复读( Repeatable Read )串行化( Serializable )Mysql 默认的事务隔离级别是可重复读 (Repeatable Read)
4.mysql间隙锁的概念
当我们用范围条件而不是相等条件检索数据, 并请求共享或排他锁时,InnoDB 会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录,叫做“间隙(GAP)” ,InnoDB 也会对这个“间隙”加锁,这种锁机制就是所谓的间隙锁
5.共享锁和排他锁
共享锁:又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
排他锁:又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据进行读取和修改。
6.mysql锁的是行数据还是索引
在MySQL中,行级锁并不是直接锁记录,而是锁索引。
7.mysql中三大日志,redo log、binlog、undo log
redo log:redo log是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。
比如 MySQL 实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。
binlog:保证了MySQL集群架构的数据一致性
undo log:在 MySQL 中,恢复机制是通过 回滚日志(undo log) 实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作
8.mysql的MVCC
多版本并发控制。对数据行的读取和更新要并发控制,并发控制的目的是为了多线程下的数据安全。
MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。
当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开始一个新的事务,系统版本号都会自动递增。
事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
9.mysql更新update语句,做了哪些操作
<1> 连接器和客户端连接
<2> 删除要update表的缓存
<3> 分析器分析sql语句是否有语法错误
<4> 优化器确定需要使用的索引
<5> 执行器调用存储引擎接口获取对应的行数据返回给server层
<6> 执行调用存储引擎接口写入更新后的数据
<7> 存储引擎接口将更新后的数据写入内存
<8> 存储引擎,提交redo 日志,进入prepare状态,通知server层
<9> server层提交binlog,通知存储引擎
<10> 存储引擎将redo日志commit
10.mysql索引一定支持最左原则匹配吗
Mysql的8.0版本之后添加了 索引跳跃扫描 的功能,当第一列索引的唯一值较少时,跳过直接匹配第二列的索引。