首页 > 数据库 > MySQL > web前端培训-MySQL的索引下推解析
以下文章来源于业余草,编辑作者是业余草
本文问题
Index Condition Pushdown(ICP)
当MySQL使用一个索引来检索表中的行时,可以使用ICP作为一种优化方案。不使用ICP时,存储引擎通过索引检索基础表中的行并将符合WHERE条件中的行返回给客户端。启用ICP后, 【关注尚硅谷,轻松学IT】如果只需要通过索引中的列就能够评估行是否符合WHERE中的一部分条件,MySQL将这部分WHERE条件下推到存储引擎中,然后存储引擎评估使用索引条目来评估下推的索引条件,并只从表中读取符合条件的行。ICP可以减少存储引擎访问基础表的次数以及MySQL访问存储引擎的次数_ 。
ICP适用情景
ICP限制
ICP优化过程
要理解ICP优化如何工作,首先考虑一下,在不使用索引下推的情况下,索引扫描是如何进行的:
ICP的EXPLIAN输出
在Extra列中显示Using index condition。
示例
假设有一个表包括人员和地址数据,在表上具有一个索引INDEX (zipcode, lastname, firstname).如果我们知道一个人的zipcode值但是不确定他的名称,我们可以使用以下查询:
SELECT * FROM people
WHERE zipcode='95054'
AND lastname LIKE '%etrunia%'
AND address LIKE '%Main Street%';
MySQL可以使用索引检索zipcode='95054'的人。第二部分不能用来限制必须扫描的行数量(lastname LIKE '%etrunia%' 因为LIKE条件以%开头),当不使用索引下推时,
【关注尚硅谷,轻松学IT】这个查询必须检索所有zipcode='95054'的整行数据
使用索引下推,MySQL在读取整行数据前,先检查lastname LIKE '%etrunia%'.这样就不用读取那些符合zipcode条件但是不符合lastname条件的行数据了。
控制ICP是否启用
可以使用iptimizer_switch变量的index_condition_pushdown标志来控制ICP是否启用
SET optimizer_switch = 'index_condition_pushdown=off';
SET optimizer_switch = 'index_condition_pushdown=on';
问题答案
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70010293/viewspace-2884884/ ,如需转载,请注明出处,否则将追究法律责任。