logo

MariaDB 5.5 和 MySQL 5.6 的新特性Index Condition Pushdown (ICP) 优化,ICP的思想很简单: 读取索引记录后,检查能用索引列计算的WHERE条件(过滤),然后才会去读取表记录。这样来避免读取不满足索引条件的表记录。 ![ICP][1]

看起来ICP不会让查询变慢,从真实例子看,那为什么使用了ICP会变慢呢? 原因是索引使用了大的VARCHAR 列,如VARCHAR(255)。详细有3个因素引起: - 索引列含有VARCHAR(255)类型。MySQL VARCHAR类型空间效率不高,如果定义了VARCHAR(255),任何值都会占用255字节; - InnoDB的行预取缓存。当InnoDB检测到需要从索引读取很多行时,会预取索引记录存储到内部缓存当中,这个缓存使用低效的内存数据展示。 - MySQL Item 类的设计。不能评估表记录是否在InnoDB的预取缓存里;表达式评估函数通过表的主要位置来查找列值,内部叫做table->record[0],ICP为了检测条件,索引列必须首先复制到table->record[0]。

参考:http://s.petrunia.net/blog/?p=101 [1]: http://s.petrunia.net/blog/wp-content/uploads/2014/10/index-access-with-icp.png

0 回复
需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。