Mysql核心内容

MySQL日志类型:

binlog:自带的二进制数据
redolog:缓存页日志
undolog:事务日志

redo log

https://www.cnblogs.com/gomysql/p/3721478.html

MySQL,innodb可重复读的实现原理

就是使用使用了mvcc多版本控制,就是同一份数据同时保留多版本的一种方式,进而实现并发控制

innodb引擎中,表的隐藏列

db_row_id(rowid):长度6byte,隐藏的自增id,如果表没有主键m,innodb会自动以db_row_id产生一个聚族索引
db_trx_id:长度byte,最近修改(insert / update)的事务id
db_roll_ptr:长度7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment中)
delete_flag

mysql 的MVCC多版本控制?

底层原理是采用:无锁机制 + 快照版本 + read view + undolog日志
插入?
更新?
删除?

mysql的快照?

https://www.jianshu.com/p/ae39ebdf402b

什么是脏页?

当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为 “脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为 “干净页”

什么情况会触发数据库的flush操作?

  1. redo log写满:这种情况的flush会导致所有更新操作暂停,将checkpiont前推,将前推过程中的日志对应的脏页全部写入磁盘中,原位置到现在停止位置就是新的可写入位置。
  2. 内存不足:内存无空闲数据页,需要通过淘汰算法选择出相应数据页,再判断淘汰的数据页是否为脏页来选择下一次操作。
  3. MySQL空闲时候:合理利用时间
  4. MySQL关闭之前:flush到磁盘,下次再启动数据库就不需要重新根据日志推导。

参数innodb_max_dirty_pages_pct是脏页比例上限,默认值是75%
参数innodb_flush_log_at_trx_commit 用来控制重做日志刷新到磁盘的策略

什么是 checkpoint

mysql 的索引

  • B+Tree索引
  • hash索引

Hash索引 和 B+Tree索引 的区别?为什么使用B+Tree索引?

  • hash索引底层使用的是哈希表,哈希表是以key-value存储数据结构,所以在多个数据在存储关系上没有顺序关系的。所以对于区间、范围查询无法使用hash索引完成,只能全表扫描。hash索引更适合于等值查询的场景。使用hash索引时容易产生哈希冲突,如果冲突量大,会导致查询效率变慢。
  • B+Tree索引 底层使用的是B+数的数据结构,是多路平衡查询树,所以他的节点是天然有序的,所以对于区间、范围查询可以使用到索引来完成,避免全表扫描。

B+树相比B-树,有什么优点?

  1. b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”
  2. b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定
  3. 对于范围查找来说,b+树只需遍历叶子节点链表即可,b树却需要重复地中序遍历

innodb的B+Tree叶子节点存储什么?区别在哪里?

innodb的B+Tree叶子可能会存储 整行数据 或者 主键值

  • 整行数据:innodb的B+Tree叶子节点存储了整行数据的是主键索引,也被称为聚簇索引
  • 主键值:innodb的B+Tree叶子节点存储了主键值的是非主键索引,也被称为非聚簇索引

所以一张表有多个B+Tree取决于你有多少个索引,每一张表至少有一个主键索引,即至少一个B+Tree,每多一个索引就会多一个B+Tree

聚簇索引查询效率比非聚簇索引快,因为根据聚簇索引就能获得该行数据。使用非聚簇索获得索引值之后,还需要通过主键值,进行二次查找获得行数据。(该过程也叫:回表

覆盖索引是什么?

覆盖索引:查询的语句需要获取的值,仅需要从索引中获取,而不需要从数据表中获取。

索引下推

mysql 5.6和5.7引用了索引下推优化,默认开启
table表建立了(a,b,c)的复合索引,当查询语句为以下:

select * from table where a='xxx' and b  like '%zzz%' and c like 'qwer'

如果没有索引下推,则MySQL会通过a=‘xxx’ 先查询出一个对应的数据,然后返回到mysql服务端(回表)。MySQL服务端在基于剩余的2个条件来校验是否符合条件。

如果使用了索引下推技术,则MySQL会首先返回条件a='xxx’的数据索引,然后根据模糊查询的条件来校验索引行是否符合条件,则直接根据索引来 定位对应的数据,如果不符合直接reject。

mysql中,查询语句底层实现逻辑和执行顺序

优化器的执行过程?

  1. 根据搜索条件,找出可能使用的索引。
  2. 计算全表扫描的代价。
  3. 计算使用不同索引执行查询的代价。
  4. 对比各种执行方案的代价没找出成本最低的一个

间隙锁

定义:在mysql的innodb引擎中,如果操作的是一个区间的数据,会锁住这个区间的所有记录,即使这个记录不存在,此时插入这个区间的数据都会进行阻塞。

主键、唯一索引会使用间隙锁吗?

如果where条件都命中的情况下,则不会发生间隙锁,只会加记录锁
如果where条件部分命中或者全不命中的情况下(范围),则会使用间隙锁

普通索引会使用间隙锁吗?

如何避免行锁升级表锁

innodb引擎中的行锁是针对索引加的锁,不是针对记录加锁,并且该索引不能失效,否则会从行锁升级成为表锁。
如果更新的数据时,条件走的是全表扫描的情况下,则会进行表锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值