• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    五分钟让你快速弄懂MySQL索引下推

    前言

    如果你在面试中,听到MySQL5.6”、“索引优化” 之类的词语,你就要立马get到,这个问的是“索引下推”。

    什么是索引下推

    索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。

    索引下推优化的原理

    我们先简单了解一下MySQL大概的架构:

    MySQL服务层负责SQL语法解析、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。

    索引下推的下推其实就是指将部分上层(服务层)负责的事情,交给了下层(引擎层)去处理。

    我们来具体看一下,在没有使用ICP的情况下,MySQL的查询:

    使用ICP的情况下,查询过程:

    索引下推的具体实践

    理论比较抽象,我们来上一个实践。

    使用一张用户表tuser,表里创建联合索引(name, age)。

    如果现在有一个需求:检索出表中名字第一个字是张,而且年龄是10岁的所有用户。那么,SQL语句是这么写的:

    select * from tuser where name like '张%' and age=10;

    假如你了解索引最左匹配原则,那么就知道这个语句在搜索索引树的时候,只能用 ,找到的第一个满足条件的记录id为1。

    那接下来的步骤是什么呢?

    没有使用ICP

    在MySQL 5.6之前,存储引擎根据通过联合索引找到name likelike '张%' 的主键id(1、4),逐一进行回表扫描,去聚簇索引找到完整的行记录,server层再对数据根据age=10进行筛选

    我们看一下示意图:

    可以看到需要回表两次,把我们联合索引的另一个字段age浪费了。

    使用ICP

    而MySQL 5.6 以后, 存储引擎根据(name,age)联合索引,找到name likelike '张%',由于联合索引中包含age列,所以存储引擎直接再联合索引里按照age=10过滤。按照过滤后的数据再一一进行回表扫描。

    我们看一下示意图:

    可以看到只回表了一次。

    除此之外我们还可以看一下执行计划,看到Extra一列里 Using index condition,这就是用到了索引下推。

    +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
    | id | select_type | table | partitions | type  | possible_keys | key      | key_len | ref  | rows | filtered | Extra                 |
    +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+
    |  1 | SIMPLE      | tuser | NULL       | range | na_index      | na_index | 102     | NULL |    2 |    25.00 | Using index condition |
    +----+-------------+-------+------------+-------+---------------+----------+---------+------+------+----------+-----------------------+

    索引下推使用条件

    索引下推的目的是为了减少回表次数,也就是要减少IO操作。对于InnoDB的聚簇索引来说,数据和索引是在一起的,不存在回表这一说。

    相关系统参数

    索引条件下推默认是开启的,可以使用系统参数optimizer_switch来控制器是否开启。

    查看默认状态:

    mysql> select @@optimizer_switch\G;
    *************************** 1. row ***************************
    @@optimizer_switch: index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on
    1 row in set (0.00 sec)
    

    切换状态:

    set optimizer_switch="index_condition_pushdown=off";
    set optimizer_switch="index_condition_pushdown=on";

    参考:

    [1].《 MySQL技术内幕 InnoDB存储引擎》

    [2]. 《MySQL实战45讲》

    [3]. MySQL索引下推(ICP)简单理解及例子

    [4]. 一文读懂什么是MySQL索引下推(ICP)

    总结

    到此这篇关于MySQL索引下推的文章就介绍到这了,更多相关MySQL索引下推内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 五分钟带你搞懂MySQL索引下推
    • 一篇文章读懂什么是MySQL索引下推(ICP)
    • MySQL索引下推(ICP)的简单理解与示例
    • MySQL带你秒懂索引下推
    上一篇:MySQL的索引系统采用B+树的原因解析
    下一篇:MySQL索引下推(ICP)的简单理解与示例
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    五分钟让你快速弄懂MySQL索引下推 五分钟,让你,快速,弄懂,