美文网首页值得一看
InnoDB理解&面试

InnoDB理解&面试

作者: Luxifer路西菲尔 | 来源:发表于2021-03-18 16:03 被阅读0次

批量执行插入操作是对数据库的优化

InnoDB是mysql下的默认存储引擎:

a) 支持ACID,简单地说就是支持事务完整性、一致性;

b) 支持行锁,以及类似ORACLE的一致性读,多用户并发;

c) 独有的聚集索引主键设计方式,可大幅提升并发读写性能

原子性:

一个事务要么全做,要么不做,主要保证机制是undo日志

undo日志记录操作的逆向操作,insert操作记录delete操作,当事务失败回滚时候则执行undo日志中的内容就可以将数据库恢复到原有状态,实现原子性

持久性:

指事务一旦提交,对于数据库的影响就是一直存在的

主要靠redo日志来实现,每个事务执行时候会刷入redo日志,当数据库下次重启时候直接读取redo日志就可以恢复数据库

隔离性:

两个事务操作互不影响

依靠锁机制(写写)与mvcc(写读)

innodb实现行锁

innodb支持行锁,通过索引实现

·未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

·提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

·可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读

·串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

脏读:

一个事务在修改数据库,另一个事务在读取数据库内容,这时候会出现脏读

不可重复读:

一个事务连续两次在读取数据库,另一个事务在这时候修改了内容,导致读取的内容不一致

幻读:

事务首先查找数据库发现没有  一行,然后准备执行插入操作,结果另一个事务在这一时刻进行插入操作,第一条事务操作失败,就像出现了幻觉。

聚集索引与非聚集索引:

聚集索引直接指向存储的物理地址

非聚集索引指向一个数据库,如果需要查询其他的内容,需要进行二次查询,通过建立符合索引来解决二次查询问题

由于索引是b树或者b+树结构,因此每次增删改都会重建索引

mysql日志系统:

redo日志,undo日志,binlog日志,慢查询日志,错误日志

redo日志:是数据格式,为了防止事务未写入磁盘重做的日志,对应事务脏页写入磁盘,就撤销

undo日志:记录事务提交之前的状态,是逻辑格式的日志,用于回滚事务操作

binlog:是逻辑格式的日志,用于主从复制,每一段时间从库通过执行binlog来保持与主库相同,事务提交后记录,一次性写入磁盘。

mvcc实现:

使用版本代替锁的概念

默认隔离级别是可重复读

隔离级别实现方式:乐观锁和悲观锁。

锁机制存在的问题:如果加了锁之后,没办法取读取数据

乐观锁:mvcc的版本的概念,在每一行加入版本的概念,使用快照数据,根据事务id来进行访问控制

mvcc读取原理:

只能读取到小于当前版本号的内容信息

插入和删除操作则选择时间点之前的版本号

如果一个事务是1,2版本持续查询

另一个事务执行插入和删除操作,那么会读取仍然是事务id为1的内容

mysql优化:

1.表结构优化(选择优化类型)

scheam优化

范式与反范式

blob与text

2.索引优化

索引:

多列索引

选择合适的索引顺序

哈希索引,查找速度相当快,但是费空间,无法用于排序

mysam存储为顺序存储,只存了行号

innodb的聚簇索引就是一张表

按照顺序插入防止页分裂,比如随机数就不好

减少冗余索引

使用压缩索引,前缀索引

3.查询优化

查询不需要的数据

分解关联查询,用小查询再代码中做拼接更好

mysql通信协议是直接把所有结果推给客户端

查询过程:

首先检查缓存,如果命中了直接返回结果

sql语句进行语法解析,语义分析

mysql根据查询优化器生成执行计划(可以优化cont,min,max,转为常数表达式)

mysql复制:

过程:

1.主库把数据记录到二进制日志中,每次提交事务之前,将数据记录到二进制日志中

2.备库将主库的二进制日志复制到自己的中继日志中

3.备库启动一个异步线程,io线程,与主库建立连接,读取主库上的二进制日志,将接收到的事件记录到中继日志

4.备库回复中继日志

原理:

1.基于语句的复制

优点:更容易理解执行过程,出现问题可以很好的定位,比如类型不一样

缺点:很多情况无法正确复制,有些语句具有顺序性,需要加锁操作

2.基于行的复制

优点:可以进行所有情况的复制,锁开销小占用更少的cpu

缺点:没有记录sql语句,导致查问题不知道原因

mysql分区表:

1、减缓单机msql表压力,分散查询

原理:

1、在执行insert,update,delete,select操作都会锁住每个底层表,除去select操作,都是确定好在哪一个分区,数据执行完后再解锁,select操作确定哪一部分分区表可以排除,然后查询剩余分区表。

相关文章

网友评论

    本文标题:InnoDB理解&面试

    本文链接:https://www.haomeiwen.com/subject/igqpcltx.html