1.索引下推    msql5.6的新特性,默认开启。 对联合索引中包含的字段先做出判断,直接过滤掉不符合条件的记录。减少回表操作。

     索引下推一般可用于所求查询字段(select列)不是/不全是联合索引的字段,查询条件为多条件查询且查询条件子句(where/order by)字段全是联合索引.

     select * from t_user where name like '张%' and is_del=1  在MySQL 5.6之前,只能从匹配的位置一个个回表。到主键索引上找出数据行,再对比字段值.通过索引下推,可以is_del在匹配的位置进行判断,不需要通过回表获取整行记录对比判断。

2.mysql中的常见三种日志

     redo log(重做日志,用于事务的持久化)   为了提升性能,事务提交之后,变更没有直接同步刷盘。而是计入Buffer poll,然后异步的将redo log变更写入磁盘文件。当Buffer Pool到达一定阀值之后,一般默认容量的75%,会同步进行刷盘。

     undo log(回滚日志,用户数据被修改前的数据)  在发送事务回滚的时候,回复到事务修改之前的状态

     bin log(同步日志) 一般在主从复制中,通过bin log slave从master中同步变更,保持数据同步。

3.MVVC 多版本并发机制

     InnoDB的MVVC机制中,每行记录有三个隐藏列来实现。记录隐式ID,事务id,回滚指针(指向当前记录的undo log).

    主要依赖Undo log及Read View:

      Undo log:用来记录一行记录的多个版本。

      ReadView:  用来判断当前版本的可见性。

      ReadView 版本链的机制,不同的事务隔离级别生成ReadView的时机不同。 在Read Commit情况下,每次select之前都会生成ReadView,在Repeated Read情况下,第一次select之前生成ReadView。

       用一个单链表的数据结构存放每个事务版本对应的行的数据,通过当前的事务id,可以获取对应的数据。 

       配合ReadView的活跃事务数组可以判断当前事务应该读取哪个节点的数据。

4.Mysql 索引类型  聚簇索引(主键索引):B+树上存在的是记录的完整信息、非聚簇索引(B+树上记录的是记录的主键索引ID)     

    覆盖索引:是指select的列和where条件列都在联合索引的列中。比如select *  from a where b='xxx'   就算b命中索引,也要回表。 

5.mysqlexplain详解   

         explain查询性能优化不可缺少的一部分,我们常常用到explain这个命令来查看一个SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。

type  表示MySQL在表中找到所需行的方式,又称“访问类型”。 常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)

ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行。

index: Full Index Scan,index与ALL区别为index类型只遍历索引树。

range:只检索给定范围的行,使用一个索引来选择行。

ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。

eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件。

const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system。

possible_keys:  指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用

Key:  key列显示MySQL实际决定使用的键(索引)

ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值。

rows: 表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。

03-28 12:19