亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

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

2024-07-24 13:07:25
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了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             |
+----------------------+----------+----------+------------+--------------+---------------+
15 rows in set, 1 warning (0.00 sec)

 

從上面的profile 可以看出ICP 開啟時整個sql 執行時間是未開啟的2/3,sending data 環節的時間消耗前者僅是后者的1/4。
ICP 開啟時的執行計劃 含有 Using index condition 標示 ,表示優化器使用了ICP對數據訪問進行優化。

復制代碼代碼如下:

mysql> explain select * from employees where first_name='Anneke' and last_name like '%nta' ;
+----+-------------+-----------+------+---------------+--------------+---------+-------+------+-----------------------+
| id | select_type | table     | type | possible_keys | key          | key_len | ref   | rows | Extra                 |
+----+-------------+-----------+------+---------------+--------------+---------+-------+------+-----------------------+
| 1  | SIMPLE      | employees | ref  | idx_emp_fnln  | idx_emp_fnln | 44      | const | 224  | Using index condition |
+----+-------------+-----------+------+---------------+--------------+---------+-------+------+-----------------------+
1 row in set (0.00 sec)

ICP 關閉時的執行計劃顯示use where.
復制代碼代碼如下:

mysql> explain select * from employees where first_name='Anneke' and last_name like '%nta' ;
+----+-------------+-----------+------+---------------+--------------+---------+-------+------+-------------+
| id | select_type | table     | type | possible_keys | key          | key_len | ref   | rows | Extra       |
+----+-------------+-----------+------+---------------+--------------+---------+-------+------+-------------+
| 1  | SIMPLE      | employees | ref  | idx_emp_fnln  | idx_emp_fnln | 44      | const | 224  | Using where |
+----+-------------+-----------+------+---------------+--------------+---------+-------+------+-------------+
1 row in set (0.00 sec)

 

案例分析

以上面的查詢為例關閉ICP 時,存儲引擎通前綴index first_name 訪問表中225條first_name 為Anneke的數據,并在MySQL server層根據last_name like '%sig' 進行過濾
開啟ICP 時,last_name 的like '%sig'條件可以通過索引字段last_name 進行過濾,在存儲引擎內部通過與where條件的對比,直接過濾掉不符合條件的數據。該過程不回表,只訪問符合條件的1條記錄并返回給MySQL Server ,有效的減少了io訪問和各層之間的交互。

ICP 關閉時 ,僅僅使用索引作為訪問數據的方式。

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

ICP 開啟時 ,MySQL將在存儲引擎層 利用索引過濾數據,減少不必要的回表,注意 虛線的using where 表示如果where條件中含有沒有被索引的字段,則還是要經過MySQL Server 層過濾。

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

四 ICP的使用限制

1 當sql需要全表訪問時,ICP的優化策略可用于range, ref, eq_ref,  ref_or_null 類型的訪問數據方法 。
2 支持InnoDB和MyISAM表。
3 ICP只能用于二級索引,不能用于主索引。
4 并非全部where條件都可以用ICP篩選。
   如果where條件的字段不在索引列中,還是要讀取整表的記錄到server端做where過濾。
5 ICP的加速效果取決于在存儲引擎內通過ICP篩選掉的數據的比例。
6 5.6 版本的不支持分表的ICP 功能,5.7 版本的開始支持。
7 當sql 使用覆蓋索引時,不支持ICP 優化方法。

 

復制代碼代碼如下:

mysql> explain select * from employees where first_name='Anneke' and last_name='Porenta' ;
+----+-------------+-----------+------+---------------+--------------+---------+-------------+------+-----------------------+
| id | select_type | table     | type | possible_keys | key          | key_len | ref         | rows | Extra                 |
+----+-------------+-----------+------+---------------+--------------+---------+-------------+------+-----------------------+
| 1  | SIMPLE | employees      | ref  | idx_emp_fnln  | idx_emp_fnln | 94      | const,const | 1    | Using index condition |
+----+-------------+-----------+------+---------------+--------------+---------+-------------+------+-----------------------+
1 row in set (0.00 sec)
mysql> explain select first_name,last_name from employees where first_name='Anneke' and last_name='Porenta' ;
+----+-------------+-----------+------+---------------+--------------+---------+-------------+------+--------------------------+
| id | select_type | table     | type | possible_keys | key          | key_len | ref         | rows | Extra                    |
+----+-------------+-----------+------+---------------+--------------+---------+-------------+------+--------------------------+
| 1  | SIMPLE      | employees | ref  | idx_emp_fnln  | idx_emp_fnln | 94      | const,const | 1    | Using where; Using index |
+----+-------------+-----------+------+---------------+--------------+---------+-------------+------+--------------------------+
1 row in set (0.00 sec)
 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本电影亚洲天堂| 国产精品情侣自拍| 亚洲免费av网址| 2019亚洲男人天堂| 欧美午夜宅男影院在线观看| 成人精品久久一区二区三区| 国产激情综合五月久久| 亚洲最大在线视频| 国产免费一区二区三区在线观看| 精品夜色国产国偷在线| 最好看的2019年中文视频| 国产精品入口夜色视频大尺度| 国产精品欧美一区二区三区奶水| 国产精品亚洲综合天堂夜夜| 成人中文字幕+乱码+中文字幕| 亚洲天堂av在线免费观看| 97视频在线观看播放| 国产成人精品久久| 国内成人精品一区| 成人国产精品一区| 国产精品视频不卡| 亚洲人成亚洲人成在线观看| 欧美色另类天堂2015| 91wwwcom在线观看| 欧美午夜视频在线观看| 欧美性视频在线| 久久综合五月天| 亚洲美女在线视频| 亚洲免费人成在线视频观看| 992tv在线成人免费观看| 久久夜精品香蕉| 国产成人精品视频在线| 久久精品成人欧美大片| 性色av一区二区咪爱| 国产精品免费视频久久久| 成人国产精品日本在线| 亚洲男人天堂古典| 国内精品美女av在线播放| 91在线观看免费高清完整版在线观看| 亚洲香蕉av在线一区二区三区| 欧美wwwwww| 最新亚洲国产精品| 海角国产乱辈乱精品视频| 在线精品国产成人综合| 成人精品福利视频| 欧美激情亚洲视频| 日韩亚洲欧美中文高清在线| 亚洲自拍偷拍色图| 中文字幕视频一区二区在线有码| 日韩福利伦理影院免费| 91精品久久久久久久久久久| 亚洲精品少妇网址| 日韩欧美国产免费播放| 成人激情黄色网| 久久大大胆人体| 亚洲欧美国产精品| 日韩精品中文字幕在线观看| 永久555www成人免费| 国产成人一区二区三区| 欧美日韩国产一区中文午夜| 日韩精品中文字幕视频在线| 国产一区二区三区精品久久久| 国产日产久久高清欧美一区| 日韩av成人在线观看| 久久综合色88| 国产精品一区二区三| 亚洲精品之草原avav久久| 欧美极品在线播放| 国产午夜一区二区| 啊v视频在线一区二区三区| 欧美日韩午夜剧场| 欧日韩不卡在线视频| 欧美精品久久久久久久久久| 欧美一区二区三区图| 韩国精品美女www爽爽爽视频| 欧美日韩成人在线观看| 亚洲国产精品va在线观看黑人| 日韩精品极品在线观看播放免费视频| 国产精品久久久久久亚洲调教| 国产91精品青草社区| 欧美电影免费在线观看| 最新国产精品亚洲| 久久久久久久一| 91国产高清在线| 亚洲免费伊人电影在线观看av| 成人免费xxxxx在线观看| 久热精品视频在线| 亚洲一区二区久久| 色中色综合影院手机版在线观看| 亚洲国产天堂久久国产91| 久久久噜噜噜久久中文字免| 在线色欧美三级视频| 在线视频欧美日韩| 精品调教chinesegay| 国产精品视频不卡| 97视频在线观看视频免费视频| 97久久超碰福利国产精品…| 欧美激情亚洲精品| 欧美电影在线观看| 国产美女久久精品香蕉69| 欧美国产激情18| 97香蕉超级碰碰久久免费软件| 久久精品久久精品亚洲人| 精品福利一区二区| 成人精品久久av网站| 亚洲国产精品久久| 中文字幕国产精品| 亚洲国模精品私拍| 国产精品偷伦免费视频观看的| 欧美在线视频一二三| 午夜精品99久久免费| 亚洲视频第一页| 国产精品久久久久久久av大片| xvideos成人免费中文版| 中文字幕日韩欧美在线| 欧美日韩一区二区精品| 成人h片在线播放免费网站| 久久男人资源视频| 久久精品99无色码中文字幕| 亚洲黄页视频免费观看| 国产精品久久久久久搜索| 国内揄拍国内精品少妇国语| 久久精品2019中文字幕| 日韩电影在线观看永久视频免费网站| 日韩在线免费av| 精品美女国产在线| 久久在线免费观看视频| 亚洲级视频在线观看免费1级| 日韩视频一区在线| 欧美性高潮在线| 日本精品va在线观看| www亚洲欧美| 日韩中文字幕在线播放| 91精品国产91久久久久久| 亚洲美女精品成人在线视频| 九九久久综合网站| 2019日本中文字幕| 亚洲精品电影久久久| 精品日本美女福利在线观看| 国产精品免费看久久久香蕉| 欧美野外wwwxxx| 97超碰国产精品女人人人爽| 欧美色视频日本高清在线观看| 欧美色欧美亚洲高清在线视频| 亚洲精品天天看| 亚洲视频国产视频| 久久99热精品这里久久精品| 欧美整片在线观看| 国产精品美女主播在线观看纯欲| 欧美激情二区三区| 欧美激情区在线播放| 人人澡人人澡人人看欧美| 国产精品久久电影观看| xxxx欧美18另类的高清| 91久久国产精品91久久性色| 日韩电影中文字幕一区| 欧美大全免费观看电视剧大泉洋| 欧美床上激情在线观看| 亚洲精品国精品久久99热一| 国产综合在线看| 操人视频在线观看欧美| 日韩中文综合网| 久久国产精品久久国产精品| 亚洲成av人影院在线观看|