mysql 索引 icp
7.1版本索引区别 icp(Index Condition Pushdown) icp 是 MySQL 中一个常用的优化,尤其是当MySQL需要从一张表里检索数据时。
ICP(Index Condition Pushdown)是 MySQL 利用索引(二级索引)元组和筛字段在索引中的 WHERE 条件从表中提取数据记录的一种优化操作。
ICP 的思想是:存储引擎在访问索引的时候检查筛选字段在索引中的 where 条件,如果索引元组中的数据不满足推送的索引条件,那么就过滤掉该条数据记录。
ICP (优化器)尽可能的把 Index Condition 的处理从 server 层下推到存储引擎层。注意:icp 是在MySQL5.6才提出来的并且在之后的版本中一直使用的优化的方式。
简单来说就是如下SQL
使用的索引是
idx_gender_city_name_monthsalary_yearbonus(gender,city,name,monthsalary,yearbonus)
select * from customers1s ignore index(idx_name_photo) where gender = 0 and city like "长%" and name like "实%" limit 0,20;


也就是说使用了ICP就是MySQL会根据与索引上的信息对数据进行过滤然后再获取数据返回出来,没有使用的话,MySQL会根据 gender = 0 取出数据然后再去 server 层中对于后面的条件进行过滤。如下就是流程,没有使用ICP的情况如下图:

①: MySQL Server 发出读取数据的命令,调用存储引擎的索引读或全表读。此处进行的是索引读。
② ③:进入存储引擎,读取索引树,在索引树上查找,把满足条件的(红色的)从表记录中读出(步骤④,通常有 IO)。
⑤:从存储引擎返回标识的结果。以上,不仅要在索引进行索引读取(通常是内存中,速度快。步骤③),还要进行步骤④,通常有 IO。
⑥:从存储引擎返回查找到的多条数据给 MySQL Server,MySQL Server 在 ⑦ 得到较多的元组。
⑦ ⑧:依据 where 子句条件进行过滤,得到满足条件的数据。注意在 MySQL Server 层得到较多数据,然后才过滤,最终得到的是少量的、符合条件的数据。
使用 ICP 流程

①:MySQL Server 发出读取数据的命令,过程同图一。
② ③:进入存储引擎,读取索引树,在索引树上查找,把满足已经下推的条件(红色的)从表记录中读出(步骤④,通常有 IO);
⑤:从存储引擎返回标识的结果。此处,不仅要在索引进行索引读取(通常是内存中,速度快。步骤③),还要在 ③ 这个阶段依据下推的条件进行判断,不满足条件的,不去读取表中的数据,直接在索引树上进行下一个索引项的判断,直到有满足条件的,才进行步骤④,这样,较没有 ICP 的方式,IO 量减少。
⑥:从存储引擎返回查找到的少量数据给 MySQL Server 在 ⑦ 得到少量的数据。因此比较图一无 ICP 的方式,返回给 MySQL Server 层的即是少量的、符合条件的数据。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
