<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Jui-Nan Lin&#039;s Blog</provider_name><provider_url>https://jnlin.org</provider_url><author_name>jnlin</author_name><author_url>https://jnlin.org/author/jnlin/</author_url><title>MySQL 5.6 的 Index Condition Pushdown</title><html>MySQL 5.6 以前的 Multi-column Index，當位於 index 中間的 column（如下例的 j）需要進行 range query 的時候，只能利用到部分的 index，需要另外讀取資料列的內容來進行判斷。舉例來說，如果有一個 Table 結構是這樣：
&lt;code&gt;
CREATE TABLE mytable (
  id int not null auto_increment primary key,
  i int(11) NOT NULL,
  j int(11) NOT NULL,
  k int(11) NOT NULL,
  val char(10) NOT NULL,
  KEY ijk (i,j,k)
) ENGINE=InnoDB;
&lt;/code&gt;

在 MySQL 5.6 之前，SQL Query 「&lt;code&gt;SELECT sum(length(val)) FROM T WHERE i=1 AND j&lt;100 AND k=100&lt;/code&gt;」 會把所有 i=1 的資料列拉出來，逐一比較 j 與 k 的值。MySQL 5.6 的 Index Condition Pushdown (ICP) 功能，把這個動作改為比較 Index tuple 而非資料列內容，可避免拉出整個資料列，降低磁碟 IO（因為資料列通常比 Index 大）。

詳細的說明可以看 MySQL 的官方文件：&lt;a href=&quot;http://dev.mysql.com/doc/refman/5.6/en/index-condition-pushdown-optimization.html&quot;&gt;Index Condition Pushdown Optimization&lt;/a&gt; 與 Percona 的測試：&lt;a href=&quot;http://www.mysqlperformanceblog.com/2014/01/03/multiple-column-index-vs-multiple-indexes-with-mysql-56/&quot;&gt;Multiple column index vs multiple indexes with MySQL 5.6&lt;/a&gt;。</html><type>rich</type></oembed>