目录与学习目标

  1. 1:前置建表语句_DDL
  2. 2:联合索引
  3. 3MySQL5.6版本后的回表优化

1:前置建表语句_DDL

    //先创建一表 ID为主键索引 K为普通索引
    create table T (
        ID int primary key,
        k int NOT NULL DEFAULT 0, 
        s varchar(16) NOT NULL DEFAULT '',
        index k(k)
    )engine=InnoDB;
对于Mysql通过索引查询来说 什么叫回表?
当需要查询的数据只在主键索引上有。然后我们回到主键索引树搜索的过程,称为回表。
如使用SQL:
select * from T where k = 1;

什么叫覆盖索引:
在这个查询里面,索引 k 已经“覆盖了”我们的查询需求,我们称为覆盖索引。这样可以避免回表
如使用SQL:
select Id from Twhere k =1;

     //先创建一表 name_age 为联合索引
    CREATE TABLE `tuser` (
          `id` int(11) NOT NULL,
          `id_card` varchar(32) DEFAULT NULL,
          `name` varchar(32) DEFAULT NULL,
          `age` int(11) DEFAULT NULL,
          `ismale` tinyint(1) DEFAULT NULL,
          PRIMARY KEY (`id`),
          KEY `id_card` (`id_card`),
          KEY `name_age` (`name`,`age`)
    ) ENGINE=InnoDB

2:联合索引

联合索引可以  直接使用里面的一个索引的 value值
来查找另一个索引里面的 value 而不用经过主键索引

当有一个高频请求时,通过name来查询age,可以采用联合索引的方式(空间换时间)

最左前缀原则:
B+ 树这种索引结构,可以利用索引的“最左前缀”,来定位记录。(即联合索引的最左边索引可以充当 单个索引)

联合索引的创建原则
1:如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的;
2:考虑空间((name,age) 的联合索引和一个 (age) 的单字段索引。age占用的空间比name要小)

image.png

3:MySQL5.6版本后的回表优化

MYSQL:5.6后的优化(index condition pushdown)(索引下推)
可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

以前(Mysql 5.6前)
select * from tuser where name like '张%' and age=10 ;
1:通过name找到 ID3 ID4 ID5 ID6
2:通过ID一个个进行会表查询  
回表4次

现在(Mysql 5.6后)
1:通过name找到 ID3 ID4 ID5 ID6
2:通过age找到 ID4 ID5
回表2次