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操作?
- redo log写满:这种情况的flush会导致所有更新操作暂停,将checkpiont前推,将前推过程中的日志对应的脏页全部写入磁盘中,原位置到现在停止位置就是新的可写入位置。
- 内存不足:内存无空闲数据页,需要通过淘汰算法选择出相应数据页,再判断淘汰的数据页是否为脏页来选择下一次操作。
- MySQL空闲时候:合理利用时间
- 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-树,有什么优点?
- b+树的中间节点不保存数据,所以磁盘页能容纳更多节点元素,更“矮胖”
- b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置,因此b+树查找更稳定
- 对于范围查找来说,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中,查询语句底层实现逻辑和执行顺序
优化器的执行过程?
- 根据搜索条件,找出可能使用的索引。
- 计算全表扫描的代价。
- 计算使用不同索引执行查询的代价。
- 对比各种执行方案的代价没找出成本最低的一个
间隙锁
定义:在mysql的innodb引擎中,如果操作的是一个区间的数据,会锁住这个区间的所有记录,即使这个记录不存在,此时插入这个区间的数据都会进行阻塞。
主键、唯一索引会使用间隙锁吗?
如果where条件都命中的情况下,则不会发生间隙锁,只会加记录锁
如果where条件部分命中或者全不命中的情况下(范围),则会使用间隙锁
普通索引会使用间隙锁吗?
如何避免行锁升级表锁
innodb引擎中的行锁是针对索引加的锁,不是针对记录加锁,并且该索引不能失效,否则会从行锁升级成为表锁。
如果更新的数据时,条件走的是全表扫描的情况下,则会进行表锁。