萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL Index Condition Pushdown(ICP)性能優化方法實例

MySQL Index Condition Pushdown(ICP)性能優化方法實例

   這篇文章主要介紹了MySQL Index Condition Pushdown(ICP)性能優化方法實例,本文講解了概念介紹、原理、實踐案例、案例分析、ICP的使用限制等內容,需要的朋友可以參考下

  一 概念介紹

  Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一種在存儲引擎層使用索引過濾數據的一種優化方式。

  a 當關閉ICP時,index 僅僅是data access 的一種訪問方式,存儲引擎通過索引回表獲取的數據會傳遞到MySQL Server 層進行where條件過濾。

  b 當打開ICP時,如果部分where條件能使用索引中的字段,MySQL Server 會把這部分下推到引擎層,可以利用index過濾的where條件在存儲引擎層進行數據過濾,而非將所有通過index access的結果傳遞到MySQL server層進行where過濾.

  優化效果:ICP能減少引擎層訪問基表的次數和MySQL Server 訪問存儲引擎的次數,減少io次數,提高查詢語句性能。

  二 原理

  Index Condition Pushdown is not used:

  1 Get the next row, first by reading the index tuple, and then by using the index tuple to locate and read the full table row.

  2 Test the part of the WHERE condition that applies to this table. Accept or reject the row based on the test result.

  Index Condition Pushdown is used

  1 Get the next row s index tuple (but not the full table row).

  2 Test the part of the WHERE condition that applies to this table and can be checked using only index columns.

  If the condition is not satisfied, proceed to the index tuple for the next row.

  3 If the condition is satisfied, use the index tuple to locate and read the full table row.

  4 est the remaining part of the WHERE condition that applies to this table. Accept or reject the row based on the test result.

  三 實踐案例

  a 環境准備

  數據庫版本 5.6.16

  關閉緩存

  代碼如下:

  set query_cache_size=0;

  set query_cache_type=OFF;

  測試數據下載地址

  b 當開啟ICP時

  代碼如下:

  mysql> SET profiling = 1;

  Query OK, 0 rows affected, 1 warning (0.00 sec)

  mysql> select * from employees where first_name='Anneke' and last_name like '%sig' ;

  +--------+------------+------------+-----------+--------+------------+

  | emp_no | birth_date | first_name | last_name | gender | hire_date |

  +--------+------------+------------+-----------+--------+------------+

  | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 |

  +--------+------------+------------+-----------+--------+------------+

  1 row in set (0.00 sec)

  mysql> show profiles;

  +----------+------------+--------------------------------------------------------------------------------+

  | Query_ID | Duration | Query |

  +----------+------------+--------------------------------------------------------------------------------+

  | 1 | 0.00060275 | select * from employees where first_name='Anneke' and last_name like '%sig' |

  +----------+------------+--------------------------------------------------------------------------------+

  3 rows in set, 1 warning (0.00 sec)

  此時情況下根據MySQL的最左前綴原則, first_name 可以使用索引,last_name采用了like 模糊查詢,不能使用索引。

  c 關閉ICP

   代碼如下:

  mysql> set optimizer_switch='index_condition_pushdown=off';

  Query OK, 0 rows affected (0.00 sec)

  mysql> SET profiling = 1;

  Query OK, 0 rows affected, 1 warning (0.00 sec)

  mysql> select * from employees where first_name='Anneke' and last_name like '%sig' ;

  +--------+------------+------------+-----------+--------+------------+

  | emp_no | birth_date | first_name | last_name | gender | hire_date |

  +--------+------------+------------+-----------+--------+------------+

  | 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 |

  +--------+------------+------------+-----------+--------+------------+

  1 row in set (0.00 sec)

  mysql> SET profiling = 0;

  Query OK, 0 rows affected, 1 warning (0.00 sec)

  mysql> show profiles;

  +----------+------------+--------------------------------------------------------------------------------+

  | Query_ID | Duration | Query |

  +----------+------------+--------------------------------------------------------------------------------+

  | 2 | 0.00097000 | select * from employees where first_name='Anneke' and last_name like '%sig' |

  +----------+------------+--------------------------------------------------------------------------------+

  6 rows in set, 1 warning (0.00 sec)

  當開啟ICP時 查詢在sending data環節時間消耗是 0.000189s

   代碼如下:

  mysql> show profile cpu,block io for query 1;

  +----------------------+----------+----------+------------+--------------+---------------+

  | Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |

  +----------------------+----------+----------+------------+--------------+---------------+

  | starting | 0.000094 | 0.000000 | 0.000000 | 0 | 0 |

  | checking permissions | 0.000011 | 0.000000 | 0.000000 | 0 | 0 |

  | Opening tables | 0.000025 | 0.000000 | 0.000000 | 0 | 0 |

  | init | 0.000044 | 0.000000 | 0.000000 | 0 | 0 |

  | System lock | 0.000014 | 0.000000 | 0.000000 | 0 | 0 |

  | optimizing | 0.000021 | 0.000000 | 0.000000 | 0 | 0 |

  | statistics | 0.000093 | 0.000000 | 0.000000 | 0 | 0 |

  | preparing | 0.000024 | 0.000000 | 0.000000 | 0 | 0 |

  | executing | 0.000006 | 0.000000 | 0.000000 | 0 | 0 |

  | Sending data | 0.000189 | 0.000000 | 0.000000 | 0 | 0 |

  | end | 0.000019 | 0.000000 | 0.000000 | 0 | 0 |

  | query end | 0.000012 | 0.000000 | 0.000000 | 0 | 0 |

  | closing tables | 0.000013 | 0.000000 | 0.000000 | 0 | 0 |

  | freeing items | 0.000034 | 0.000000 | 0.000000 | 0 | 0 |

  | cleaning up | 0.000007 | 0.000000 | 0.000000 | 0 | 0 |

  +----------------------+----------+----------+------------+--------------+---------------+

  15 rows in set, 1 warning (0.00 sec)

  當關閉ICP時 查詢在sending data環節時間消耗是 0.000735s

   代碼如下:

  mysql> show profile cpu,block io for query 2;

  +----------------------+----------+----------+------------+--------------+---------------+

  | Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |

  +----------------------+----------+----------+------------+--------------+---------------+

  | starting | 0.000045 | 0.000000 | 0.000000 | 0 | 0 |

  | checking permissions | 0.000007 | 0.000000 | 0.000000 | 0 | 0 |

  | Opening tables | 0.000015 | 0.000000 | 0.000000 | 0 | 0 |

  | init | 0.000024 | 0.000000 | 0.000000 | 0 | 0 |

  | System lock | 0.000009 | 0.000000 | 0.000000 | 0 | 0 |

  | optimizing | 0.000012 | 0.000000 | 0.000000 | 0 | 0 |

  | statistics | 0.000049 | 0.000000 | 0.000000 | 0 | 0 |

  | preparing | 0.000016 | 0.000000 | 0.000000 | 0 | 0 |

  | executing | 0.000005 | 0.000000 | 0.000000 | 0 | 0 |

  | Sending data | 0.000735 | 0.001000 | 0.000000 | 0 | 0 |

  | end | 0.000008 | 0.000000 | 0.000000 | 0 | 0 |

  | query end | 0.000008 | 0.000000 | 0.000000 | 0 | 0 |

  | closing tables | 0.000009 | 0.000000 | 0.000000 | 0 | 0 |

  | freeing items | 0.000023 | 0.000000 | 0.000000 | 0 | 0 |

  | cleaning up | 0.000007 | 0.000000 | 0.000000 | 0 | 0 |

  +----------------------+----------+---------

copyright © 萬盛學電腦網 all rights reserved