覆盖索引

    如果现在有一个高频请求,要根据市民的身份证号查询他的姓名,这个联合索引就有意义了。它 可以在这个高频请求上用到覆盖索引,不再需要回表查整行记录,减少语句的执行时间。

    最左前缀原则
    image.png

    可以看到,索引项是按照索引定义里面出现的字段顺序排序的。

    当你的逻辑需求是查到所有名字是“张三”的人时,可以快速定位到ID4,然后向后遍历得到所有 需要的结果。

    如果你要查的是所有名字第一个字是“张”的人,你的SQL语句的条件是”where name like ‘张%’”。这时,你也能够用上这个索引,查找到第一个符合条件的记录是ID3,然后向后遍历, 直到不满足条件为止。

    索引下推
    image.png

    在MySQL 5.6之前,只能从ID3开始一个个回表。到主键索引上找出数据行,再对比字段值。

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

    无索引下推执行流程:(图3)
    image.png

    索引下推执行流程:(图4)
    image.png

    图3中,在(name,age)索引里面我特意去掉了age的值,这个过程InnoDB并不会去看age的值, 只是按顺序把“name第一个字是’张’”的记录一条条取出来回表。因此,需要回表4次。

    图4跟图3的区别是,InnoDB在(name,age)索引内部就判断了age是否等于10,对于不等于10的 记录,直接判断并跳过。在我们的这个例子中,只需要对ID4、ID5这两条记录回表取数据判 断,就只需要回表2次。