登录
首页 >  数据库 >  MySQL

MySQL 索引下推

来源:SegmentFault

时间:2023-01-24 20:19:39 440浏览 收藏

对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《MySQL 索引下推》,主要介绍了MySQL、索引,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

MySQL 架构

msZxl5IjwiYK4TE

(图片来源于《MySQL 实战 45 讲》)

索引下推

索引下推,简称 ICP,英文全称:

SET optimizer_switch = 'index_condition_pushdown=off';

从一个查询开始

如下:

create table if not exists `sakila`.`user` (  
    `id` int unsigned auto_increment not null ,  
    `age` tinyint unsigned not null default 0,  
    `name` varchar(30) not null default '',  
    `city` varchar(30) not null default '',  
    primary key (`id`),  
    key `idx_age_name`(`age`, `name`) using BTREE  
) engine=InnoDB;  
  
insert into `sakila`.`user` (`age`, `name`, `city`) values (10, 'Jack', 'Beijing'),  
                                                           (5, 'Jane', 'Shanghai'),  
                                                           (21, 'Jhon', 'ChongQing');

现在有以下查询:

select * from `sakila`.`user` where age > 9 and name = 'Jane';

通过

MySQL [(none)]> explain select * from `sakila`.`user` where age > 9 and name = 'Jane'\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: user
   partitions: NULL
         type: range
possible_keys: idx_age_name
          key: idx_age_name
      key_len: 1
          ref: NULL
         rows: 2
     filtered: 33.33
        Extra: Using index condition
1 row in set, 1 warning (0.01 sec)

 Extra: Using index condition
中,我们知道这条查询可能使用了索引下推

不开启 ICP

OhEulcz5on7jgPH
  • Server 层调用 Engine 查询数据
  • Engine 根据联合索引查询
    age > 9
    的数据
  • 找到每一条满足条件(
    age > 9
    ) 的数据并根据主键 ID 回表,直到找到不符合条件的结果
  • 数据返回给 Server 层,Server 层根据条件过滤(
    name = 'Jane'
    ),流程结束

开启 ICP

HWNpBCVsg65Ycl2
  • Server 层调用 Engine 查询数据
  • Engine 根据联合索引查询
    age > 9
    的数据,再根据联合索引中已存在的
    name
    字段进行过滤,找到符合条件的数据
  • 根据找到符合条件的数据,回表查询
  • 返回数据给Server层,流程结束

ICP 的限制

  • ICP 适用的访问方法:range、ref、eq_ref 和 ref_or_null
  • ICP可以用于
    InnoDB
    MyISAM
    表(MySQL 5.7 已经支持分区表)
  • 对于 InnoDB,ICP 只用于二级索引
  • 子查询不支持索引下推

小结

对比开启 ICP 和不开启 ICP ,开启 ICP 数据的过滤放在了引擎层,明显减少了回表的次数和返回的数据,节省了磁盘 IO。

参考

今天带大家了解了MySQL、索引的相关知识,希望对你有所帮助;关于数据库的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>