mysql是怎样执行的
首先mysql连接器处理和客户端的连接,之后接收到客户端的请求后,分析器开始进行词法分析,语法分析,之后将分析后的结果传给优化器,优化器会生成执行计划,进行索引选择,然后将执行计传给执行器,执行器调用存储引擎进行读写操作,最后将执行结果返回给客户端
讲一下mysql的事务
mysql的事务简称ACID,原子性,一致性,隔离性,持久性,其中隔离性有四种级别,分别是读未提交,读已提交,可重复读,串行化,隔离性是使用mvcc实现的
Mysql的redo log,binlog,undo log是干什么用的
undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC。
redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复;
binlog (归档日志):是 Server 层生成的日志,主要用于数据备份和主从复制;
什么是next-key lock
锁一个区间,左开右闭,枷锁原则是
1. next-key lock 是前开后闭
2. 查找过程中访问到的对象才会加锁,比如用不到主键索引时不加锁
3. 索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。
4. 索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,nextkey lock 退化为间隙锁。
5. 唯一索引上的范围查询会访问到不满足条件的第一个值为止。
讲一下mvcc
innodb在开启事务时会生成一个事务id,是按先后顺序严格递增的,数据更新时会使记录更新的事务id,这样一行数据会有多个版本,每个版本的事务id不一样,当事务启动时,会记录当前所有未提交事务的id,然后将事务id排序,最小的为低水位,最高的为高水位,小于低水位的事务id是可见的,大于高水位的事务是不可见的,在低水位和高水位之间的事务id,如果在未提交的集合里是不可见的,分则是可见的
在mvcc下怎样保证更新逻辑没有问题?
mvcc是快照读,更新时是当前读,当前读时会加行所,只有前一个事务更新完释放行所后才能执行,此时看到的数据就是最新的数据
讲一下mysql的索引
mysql的innodb引擎是使用b+树作为索引的,索引又分为主键索引和普通索引,主键索引对应的值是数据,普通索引对应的值是主键索引
怎么避免回表
把需要查询的内容建立联合索引,比如想通过条件a获取b列的值,那么建一个ab的联合索引就可以避免回表
innodb引擎使用自增主键有什么好处
b+树的存储是有序的,如果按照顺序写入,就会按顺序将数据填满,如果是随机顺序的话会出现数据写入已满的数据页,这个时候需要申请一个新的数据页并且挪动数据过去,这个过程叫做页分裂,页分裂会影响性能和空间利用率