Mysql可以分为Server层和存储引擎层
所以,最终进行I/O的是存储引擎对文件系统进行I/O操作
索引下推(Index Condition Pushdown,简称 ICP)
对应InnoDB,索引下推适用于非聚簇索引(二级索引)。
当禁用ICP时,如果使用了索引a,b进行查询,Server会先使用a通过存储引擎去查索引B+树,通过索引拿到一个主键,这时候Server会使用这一个主键去回表再去查数据,所以每次都要回表,I/O频繁,大大降低了性能。然后Server层根据查回来的数据再使用索引b进行一次过滤,最终返回数据。
当启用ICP时,如果使用了索引a,b进行查询,Server会使用a和b通过存储引擎去查B+树,查到a的子节点,同时在a的子节点查符合b的主键,然后直接拿到同时符合条件a和b的主键,然后Server层进行一次回表查询,就可以直接返回数据。
疑问:索引下推是适用于二级索引,那未开启ICP,且联合索引(a,b,c)的情况,联合索引同时使用a,b去查的话,是使用a查回来的所有主键去回表,然后Server过滤 ,还是用同时满足a和b的主键去回表查数据呢?