暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 索引下推:提升查询效率

架构经纬 2024-10-18
53

【每天5分钟,了解一个知识点】

天咱们来聊聊 MySQL 中的一项重要优化技术——索引下推。

MySQL 索引下推,英文名叫 Index Condition Pushdown(简称 ICP),它首次出现在 MySQL 5.6 版本中。这个技术主要是为了提高查询效率,特别是在查询涉及到非主键索引(也常被叫做二级索引或辅助索引)的时候,效果尤为明显。

那在没有索引下推的时候,MySQL 是怎么查询的呢?它会先通过索引找到可能匹配的行 ID,接着根据这些 ID 去访问实际的数据行,也就是回表操作,获取完整数据行后,在 Server 层再应用 WHERE 条件过滤出最终结果。但这个过程可能会导致很多不必要的数据被读取到 Server 层,浪费了时间和资源。

而索引下推就优化了这个流程。它能让 MySQL 把部分 WHERE 条件直接下推到存储引擎层。这样在读取索引记录的时候就可以进行过滤,更早地排除那些不符合条件的记录,从而减少回表的次数和数据传输量,最终提升查询性能。

咱们来举个例子说明一下。假设有一个表叫 employees,里面有字段 id(这是主键)、name(姓名)、age(年龄)、department_id(部门 ID)。并且针对 department_id 和 age 字段建立了一个组合索引。

CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(255),
age INT,
department_id INT,
INDEX idx_department_age(department_id, age)
);

现在我们要执行一个查询,找部门 ID 为 5 并且年龄大于 30 岁的员工。

SELECT * FROM employees WHERE department_id = 5 AND age > 30;

如果没有索引下推,MySQL 会先使用 idx_department_age 索引找到所有 department_id = 5 的记录。然后对于每条记录都进行回表操作,获取完整的行数据。最后在 Server 层检查每行数据的 age 字段是否大于 30,把不满足条件的记录丢弃掉。

但如果启用了索引下推,MySQL 同样使用 idx_department_age 索引,不过是在存储引擎层直接检查 department_id = 5 并且 age > 30 的记录。只有同时满足这两个条件的记录才会被标识出来,然后再回表获取这些记录的完整数据。这样一来,回表操作就大大减少了,查询效率自然就提高了。

通过索引下推,MySQL 能够在索引遍历的过程中就过滤掉大量不满足条件的记录,避免了没用的回表操作。这对于大数据集和复杂查询特别有好处。不过呢,索引下推的效果也不是绝对的,它取决于查询的具体条件和数据分布情况,不是在所有情况下都能显著提升性能。例如数据表数据量较小对于数据量较小的表,索引下推带来的性能提升可能非常有限。在这种情况下,开启索引下推可能会增加一些额外的计算开销,反而降低查询效率。

【关联阅读】

关注公众号,回复【Java面试】,获取更多面试资料


文章转载自架构经纬,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论