索引下推ICP

索引下推 (ICP)?

在没有使用ICP的情况下,MySQL的查询:
  • 存储引擎读取索引记录;

  • 根据索引中的主键值,定位并读取完整的行记录;

  • 存储引擎把记录交给Server层去检测该记录是否满足WHERE条件。

使用ICP的情况下,查询过程:
  • 存储引擎读取索引记录(不是完整的行记录);

  • 判断WHERE条件部分能否用索引中的列来做检查,条件不满足,则处理下一行索引记录;

  • 条件满足,使用索引中的主键去定位并读取完整的行记录(就是所谓的回表);

  • 存储引擎把记录交给Server层,Server层检测该记录是否满足WHERE条件的其余部分。

索引下推使用条件
  • 只能用于rangerefeq_refref_or_null访问方法;

  • 只能用于InnoDBMyISAM存储引擎及其分区表;

  • InnoDB存储引擎来说,索引下推只适用于二级索引(也叫辅助索引);

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

  • 引用了子查询的条件不能下推;

  • 引用了存储函数的条件不能下推,因为存储引擎无法调用存储函数。

示例说明
表结构
CREATE TABLE users (
    id INT PRIMARY KEY,
    age INT,
    name VARCHAR(50),
    city VARCHAR(50),
    KEY idx_age_city (age, city)
);
查询语句
SELECT * FROM users 
WHERE age > 25 
  AND city LIKE 'New%' 
  AND name = 'Alice';
ICP 优化过程
  1. 存储引擎使用索引 idx_age_city 扫描 age > 25 的索引项。

  2. 直接在索引层过滤 city LIKE 'New%'

  3. 仅回表满足 age > 25 AND city LIKE 'New%' 的行。

  4. 服务器层过滤 name = 'Alice'

你可能感兴趣的:(好记性不如烂笔头,mysql)