假期来回顾下mysql知识点,你还记得哪些?
MySQL中的存储引擎MyISAM 与 InnoDB的区别有哪些?
区别点 | MyISAM | InnoDB |
---|---|---|
事务 | 不支持事务 | 支持事务 |
外键 | 不支持外键 | 支持外键 |
索引 | 非聚集索引,索引和数据文件是分离的 | 聚集索引 |
日志 | 没有日志文件 | 有日志文件 |
行数(count) | 保存了整个表行数 | 不保存表的具体行数 |
文件格式 | myd是数据文件,myi是索引文件 | ibd是数据文件 |
锁 | 支持表级锁 | 支持表,行锁 |
为什么mysql推荐使用自增id作为主键?
可以从三个方面思考这个问题:
1.占用空间方面:如果是普通索引在B+树上存放的是主键索引的值,若该值较大会导致存储的空间较大。
2.顺序插入方面:使用自增ID做主键索引新插入的数据只要放在该树的最尾端就可以了,直接按照顺序插入即可。
3.维护成本方面:如果主键索引不为自增ID,那数据就可能从树的中间插入,树的数据结构会频繁变动,导致维护成本增加。
常见的简单的查询sql语句是怎么执行的呢?
1.首先要通过连接器跟客户端建立连接。
2.通过查询缓存,查询之前是否有查询执行过该sql语句,有则直接返回结果,没有就执行下一步。
3.通过分析器,分析该sql的语义是否符合规则,包括格式,表等等是否正确。
4.通过优化器优化该语句,如索引,join表连接顺序等
5.验证权限,验证是否有该表的查询权限,有就进行下一步,没有就返回。
6.通过执行器调用存储引擎执行该SQL,返回执行结果。
mysql中Innodb事务为什么要两阶段提交?
mysql中有六种日志文件分别是重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log)等等。
redolog 是 InnoDB 存储引擎所特有的一种日志,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。可以做数据恢复并且提供 crash-safe 能力。当有增删改相关的操作时,会先记录到 Innodb 中,并修改缓存页中的数据,等到 mysql 闲下来的时候才会真正的将 redolog 中的数据写入到磁盘当中。
undolog 是 InnoDB 存储引擎的日志,用于保证数据的原子性,保存了事务发生之前的数据的一个版本,也就是说记录的是数据是修改之前的数据,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)。
主要作用:事务回滚和实现多版本控制(MVCC)
binlog 是归档日志,属于 Server 层的日志,是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息。主要作用:主从复制和数据恢复。
如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致的情况
索引是什么?索引失效的场景有哪些?
索引是一个数据结构,相当于一本书的目录一样,帮助提高查询效率。
索引失效场景有以下几点:
- 最左前缀原则,where条件后的索引顺序不能乱
- 不要再索引上做任何操作,比如计算,函数,转换。
- 不能使用索引中的值进行范围查询(bettween,in,>,<).
- 索引字段使用判断时,会导致索引失效转向全表扫描。
- 索引字段使用is null或is not null判断时会导致索引失效,而进行全表扫描。
- 索引字段使用like,字符串不加单引号,使用or时都会导致索引失效,进行全表扫描。
什么是索引下推?
索引下推是 MySQL5.6 中开始引入的新特性,英文是 index condition pushdown,一般简称为 ICP,在搜索引擎中提前判断对应的搜索条件,索引下推通过减少回表的次数,来提高数据库的查询效率。
什么是覆盖索引?
覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取,可以减少回表的次数。
Innodb为什么采用B+树存储数据,不采用B-树?
因为B+ 树只在叶子结点储存数据,非叶子结点不存具体数据,只存 key,查询更稳定,增大了广度,而一个节点就是磁盘一个内存页,内存页大小固定,那么相比 B 树,B- 树这些「可以存更多的索引结点」,宽度更大,树高矮,节点小,拉取一次数据的磁盘 IO 次数少,并且 B+ 树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,效率更高。索引采用B+树存储数据。
什么是事务?其特性是什么?
事务是指是程序中一系列操作必须全部成功完成,有一个失败则全部失败。
事务特性有四个:
- 原子性(Atomicity):要么全部执行成功,要么全部不执行。
- 一致性(Consistency):事务前后数据的完整性必须保持一致。
- 隔离性(Isolation):隔离性是当多个事务同事触发时,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability):事务完成之后的改变是永久的。
事务的隔离级别有哪些?
. 读提交的: 即能够读取到那些已经提交的数据。
. 读未提交: 即能够读取到没有被提交的数据。
. 可重复读: 可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。
. 可串行化: 最高事务隔离级别,不管多少事务,都是依次按序一个一个执行。
1.脏读: 脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读。
2.不可重复读: 指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的。
3.幻读: 当事务不是独立执行时发生的一种现象。是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现「好像刚刚的更改对于某些数据未起作用」,但其实是事务B刚插入进来的这就叫幻读。
MVCC是什么 ,有什么作用?
MVCC:多版本并发控制,是现代数据库(包括 MySQL、Oracle、PostgreSQL 等)引擎实现中常用的处理读写冲突的手段,MVCC 允许数据具有多个版本,这个版本可以是时间戳或者是全局递增的事务 ID,在同一个时间点,不同的事务看到的数据是不同的,这个修改的数据是记录在 undolog 中的。目的在于提高数据库高并发场景下的吞吐性能。
MVCC 协议下,每个读操作会看到一个一致性的快照,这个快照是基于整个库的,并且可以实现非阻塞的读,用于支持读提交和可重复读隔离级别的实现。
Buffer Pool 是做什么的?
Buffer Pool是一块内存区域,为了提高数据库的性能,当数据库操作数据的时候,把硬盘上的数据加载到 Buffer Pool,不直接和硬盘打交道,操作的是 Buffer Pool里面的数据,数据库的增删改查都是在 Buffer Pool上进行的。
Buffer Pool里面缓存的数据内容也是一个个数据页,其中有三大双向链表:
- free 链表:用于帮助我们找到空闲的缓存页。
- flush 链表:用于找到脏缓存页,也就是需要刷盘的缓存页。
- lru 链表:用来淘汰不常被访问的缓存页,分为热数据区和冷数据区,冷数据区主要存放那些不常被用到的数据。
预读机制: Buffer Pool 有一项特技叫预读,存储引擎的接口在被 Server 层调用时,会在响应的同时进行预判,将下次可能用到的数据和索引加载到 Buffer Pool。