From 50e7d02355ee4857247754cccf756e277e6a0d71 Mon Sep 17 00:00:00 2001 From: asahi Date: Mon, 17 Feb 2025 20:41:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=85=E8=AF=BBinnodb=20icp=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mysql/mysql文档/mysql_索引.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mysql/mysql文档/mysql_索引.md b/mysql/mysql文档/mysql_索引.md index 04a90ce..9c685b3 100644 --- a/mysql/mysql文档/mysql_索引.md +++ b/mysql/mysql文档/mysql_索引.md @@ -31,6 +31,9 @@ - [开启MRR优化](#开启mrr优化) - [mrr控制](#mrr控制) - [read\_rnd\_buffer\_size](#read_rnd_buffer_size) + - [Index Condition Pushdown(ICP)](#index-condition-pushdownicp) + - [关闭ICP](#关闭icp) + - [开启ICP](#开启icp) # innodb索引与算法 @@ -360,5 +363,17 @@ select * from t where key_part1 >= 1000 and key_part1 < 2000 and key_part2 = 100 #### read_rnd_buffer_size `read_rnd_buffer_size`用来控制键值的缓冲区大小,当大于该值时,则执行器则对已经缓存的数据根据rowId来进行排序,并通过rowId来获取数据。该值默认为`256K`. +## Index Condition Pushdown(ICP) +可以通过`optimizer_switch`中的flag来控制`ICP`是否开启,如`index_condition_pushdown`为`on`,代表icp开启。 +例如,表`people`包含`(zip_code, last_name, first_name)`索引,执行如下语句 +```sql +select * from people where zipcode = '95054' and last_name like '%asahi%' and address like '%street%'; +``` + +### 关闭ICP +如果ICP优化没有开启,那么数据库首先会根据索引查询`zipcode`为95054的记录,然后查询出后再根据查询出的结果过滤where的后两个条件`last_name like '%asahi%' and address like '%street%'`。 + +### 开启ICP +当开启ICP后,数据库会将where的部分过滤条件放在存储引擎层,在索引获取数据同时就会进行where条件的过滤。