| Index Condition Pushdown(ICP)是MySQL5.6中新特性,是一种在存储擎层使用索引过滤数据的优化方式。 |
| 从二级索引中查找数据,如果二级索引中已经有了要筛选的列,但是又不能使用索引,会先从该二级索引筛选完以后再回表。 |
| |
| 好处:ICP可以减少存储引擎必须访问基表的次数和MySQL服务器必须访问存储引擎的次数。 |
| 但是, ICP的加速效果取决于在存储引擎内通过ICP筛选掉的数据的比例。 |
| # 举例1: |
| USE atguigudb1; |
| |
| EXPLAIN SELECT * FROM s1 WHERE key1 > 'z' AND key1 LIKE '%a'; |
| |
| # 举例2: |
| # 创建表 |
| CREATE TABLE `people` ( |
| `id` INT NOT NULL AUTO_INCREMENT, |
| `zipcode` VARCHAR(20) COLLATE utf8_bin DEFAULT NULL, |
| `firstname` VARCHAR(20) COLLATE utf8_bin DEFAULT NULL, |
| `lastname` VARCHAR(20) COLLATE utf8_bin DEFAULT NULL, |
| `address` VARCHAR(50) COLLATE utf8_bin DEFAULT NULL, |
| PRIMARY KEY (`id`), |
| KEY `zip_last_first` (`zipcode`,`lastname`,`firstname`) |
| ) ENGINE=INNODB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin; |
| |
| # 添加数据 |
| INSERT INTO `people` VALUES |
| ('1', '000001', '三', '张', '北京市'), |
| ('2', '000002', '四', '李', '南京市'), |
| ('3', '000003', '五', '王', '上海市'), |
| ('4', '000001', '六', '赵', '天津市'); |
| |
| # 测试:where后的第1个条件使用到了索引,第2和第3个条件没有使用到索引,所以回表 |
| EXPLAIN SELECT * FROM people |
| WHERE zipcode='000001' |
| AND lastname LIKE '%张%' |
| AND address LIKE '%北京市%'; |
| |
| # 测试:where后的3个条件都用到了索引 |
| EXPLAIN SELECT * FROM people |
| WHERE zipcode='000001' |
| AND lastname LIKE '张%' |
| AND firstname LIKE '三%'; |
| |
| |
| |
| SET optimizer_switch = 'index_condition_pushdown=off'; |
| |
| |
| SET optimizer_switch = 'index_condition_pushdown=on'; |
| 如果表访问的类型为range、 ref、 eq_ref和ref_or_null可以使用ICP |
| ICP可以用于InnoDB和MyISAM表,包括分区表InnoDB和MyISAM表 |
| 对于InnoDB表,ICP仅用于二级索引。IICP的目标是减少全行读取次数,从而减少I/O操作。 |
| 当SQL使用覆盖索引时,不支持ICP。因为这种情况下使用ICP不会减少I/O。 |
| 相关子查询的条件不能使用ICP |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术
2021-06-17 jdbc操作mysql(三):利用注解封装
2021-06-17 jdbc操作mysql(二):封装