sql优化之部分索引(Using index condition简称ICP)
文章目录
- 1、问题
- 2、为什么
- 3、怎么做
1、问题
存在联合索引a-b,某个查询where b=xxx,这个时候是使用索引还是全表扫描?
2、为什么
对于这种情况需要结合具体的情况,分析器会选择全表扫描或者部分索引。
全表则是数据量小的时候会直接使用扫描全表,这里不赘述。
- 什么是部分索引?
在二级索引中,虽然这个查询没有使用到a,但是可以强行使用a。强行使用a-b联合索引,用a遍历过程中强行带出b来判断当前这个主键是否能排除,直至筛选出所有主键进行回表。称之为“部分索引”(Using index condition简称 ICP)这里和全表扫描不同,如果是全表扫描,则是将所有数据上传到service层using where筛选,比起强行使用索引下推大大节约传输和内存开销
3、怎么做
这里涉及到联合索引的管理,如果这个语句的优化值得建立一个b的索引来避免这个部分索引,那么则可以使用完整的联合索引或者是单独建立一个新的索引