索引覆盖

SQL在执行时,需要查询的字段在当前索引对应的字段中都包含了,那么表示此SQL走完索引后不用回表了,所需要的字段都在当前索引的叶子节点上存在。

最左前缀原则

当一个SQL想要利用索引,就一定要提供该索引所对应的字段中最左边的字段,这样才能用到联合索引;这是由于在建立联合索引时,底层B+树是按照字段从左到右去比较大小进行排序的,所以想利用B+树进行快速查找也得符合这个规则。

pg 左前缀索引失效 索引 最左前缀_数据库

Innodb是如何实现事务的

Innodb通过Buffer Pool,LogBuffer,Redo Log来实现事务,以一个update语句为例:

1、Innodb在收到一个update语句后,会先根据条件找到数据所在页,并将该页数据缓存在Buffer Pool中

2、执行update语句,修改Buffer Pool中的数据,也就是内存中的数据

3、针对update语句生成一个RedoLog对象,并存入LogBuffer中

4、针对update语句生成undolog日志,用于事务回滚

5、如果事务提交,那么则把RedoLog对象进行持久化,后续还有其他机制将Buffer Pool所修改的数据页持久化到磁盘中

6、如果事务回滚,则利用undolog日志进行回滚

B树和B+树的区别,为什么Mysql使用B+树

B树特点:

        1、节点排序

        2、一个节点可以存储多个元素,多个元素进行了排序

pg 左前缀索引失效 索引 最左前缀_子节点_02

B+树特点:

        1、拥有B树的特点

        2、叶子节点之间有指针

        3、非叶子节点上的元素在叶子节点上都冗余了,也即叶子节点存储了所有的元素,且排好序

pg 左前缀索引失效 索引 最左前缀_子节点_03

Mysql中一个Innodb页就是一个B+树节点,默认16kb,一般情况下三层的B+树可以存2000多万行数据(16kb叶子节点至少可存储16条记录,非叶子节点至少可存储16kb/8+6b=1170条数据,三层数据量为2190万),利用叶子节点存储了所有数据,且数据经过了排序,叶子节点之间有指针,可以很好的支持全表扫描,范围查找等sql语句。

Mysql锁有哪些

按照锁粒度分:

        行锁:锁某行数据,锁粒度最小,可支持的并发高

        表锁:锁整张表,锁粒度最大,可支持的并发低

        间隙锁:锁的是一个区间

按照锁排它性分:

        共享锁:也即读锁,一个事务给某行数据加了读锁,其他事务可以读,但不能写

        排它锁:也即写锁,一个事务给某行数据加了写锁,其他事务既不能读也不能写

按照对待竞争的态度分

        乐观锁:并不会真正的锁某行记录,而是通过一个版本号来实现

        悲观锁:上面的行锁、表锁、间隙锁等都是悲观锁,实际加锁

在事务隔离级别实现中,需要利用锁来解决幻读

Mysql慢查询如何优化

1、检查是否使用了索引

2、检查使用的索引是否是最优索引

3、检查查询的字段是否都是必须的,是否查询了过多字段

4、检查表中数据是否过多,是否应该分库分表

5、检查数据库实例所在机器性能配置,是否需要增加资源