成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

數據庫 MySQL 新聞
今天主要介紹一下mysql的ICP特性,可能很多人都沒聽過,這里用一個實驗來幫助大家加深一下理解。

 概述

今天主要介紹一下mysql的ICP特性,可能很多人都沒聽過,這里用一個實驗來幫助大家加深一下理解。

[[271297]]

一、Index_Condition_Pushdown

Index Condition Pushdown (ICP)是MySQL用索引去表里取數據的一種優化。如果禁用ICP,引擎層會穿過索引在基表中尋找數據行,然后返回給MySQL Server層,再去為這些數據行進行WHERE后的條件的過濾。

ICP啟用,如果部分WHERE條件能使用索引中的字段,MySQL Server 會把這部分下推到引擎層。存儲引擎通過使用索引條目,然后推索引條件進行評估,使用這個索引把滿足的行從表中讀取出。ICP能減少引擎層訪問基表的次數和MySQL Server 訪問存儲引擎的次數。總之是 ICP的優化在引擎層就能夠過濾掉大量的數據,這樣無疑能夠減少了對base table和mysql server的訪問次數。

ICP的優化用于range, ref, eq_ref, and ref_or_null訪問方法,當這些需要訪問全表的行。這個策略可以用于INNODB和MyISAM表。

二、實驗

先從一個簡單的實驗開始直觀認識ICP的作用。

1、導入示例數據

這里使用Employees Sample Database,作為示例數據庫。

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

將下載的壓縮包解壓后,會看到一系列的文件,其中employees.sql就是導入數據的命令文件。執行

  1. #yum -y install bzip2 
  2. #tar -xvf employees_db-full-1.0.6.tar.bz2 
  3. #mysql -uroot -p<employees.sql 
詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

就可以完成建庫、建表和load數據等一系列操作。此時數據庫中會多一個叫做employees的數據庫。庫中的表如下:

  1. mysql > SHOW TABLES; 

 

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

下面將使用employees表做實驗。

2、建立聯合索引

employees表包含雇員的基本信息,表結構如下:

  1. mysql > DESC employees.employees; 

 

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

這個表默認只有一個主索引,因為ICP只能作用于二級索引,所以我們建立一個二級索引:

  1. ALTER TABLE employees.employees ADD INDEX first_name_last_name (first_name, last_name); 

這樣就建立了一個first_name和last_name的聯合索引。

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

3、查詢(ICP啟用)

為了明確看到查詢性能,啟用profiling并關閉query cache:

  1. SET profiling = 1; 
  2. SET query_cache_type = 0; 
  3. SET GLOBAL query_cache_size = 0; 

 

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

然后看下面這個查詢:

  1. mysql > SELECT * FROM employees WHERE first_name='Mary' AND last_name LIKE '%man'

 

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

根據MySQL索引的前綴匹配原則,兩者對索引的使用是一致的,即只有first_name采用索引,last_name由于使用了模糊前綴,沒法使用索引進行匹配。我將查詢聯系執行三次,結果如下:

  1. mysql> show profiles; 

 

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

查看執行計劃

  1. mysql> explain SELECT * FROM employees WHERE first_name='Mary' AND last_name LIKE '%man'

 

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

4、查詢(ICP禁用)

關閉ICP:

  1. SET optimizer_switch='index_condition_pushdown=off'

 

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

在運行三次相同的查詢,結果如下:

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

有意思的事情發生了,關閉ICP后,同樣的查詢,耗時是之前的三倍以上。

下面我們用explain看看后者的執行計劃:

  1. mysql> explain SELECT * FROM employees WHERE first_name='Mary' AND last_name LIKE '%man'

 

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

從開啟ICP和關閉ICP的執行計劃可以看到區別在于Extra,開啟ICP時,用的是Using index condition;關閉ICP時,是Using where。

其中Using index condition就是ICP提高查詢性能的關鍵。下面說明ICP提高查詢性能的原理。

三、原理

ICP的原理簡單說來就是將可以利用索引篩選的where條件在存儲引擎一側進行篩選,而不是將所有index access的結果取出放在server端進行where篩選。

以上面的查詢為例,在沒有ICP時,首先通過索引前綴從存儲引擎中讀出224條first_name為Mary的記錄,然后在server段用where篩選last_name的like條件;而啟用ICP后,由于last_name的like篩選可以通過索引字段進行,那么存儲引擎內部通過索引與where條件的對比來篩選掉不符合where條件的記錄,這個過程不需要讀出整條記錄,同時只返回給server篩選后的6條記錄,因此提高了查詢性能。

1) 不使用ICP時,如何進行索引掃描

(1)當storage engine讀取下一行時,首先讀取索引元組(index tuple),然后使用索引元組在基表中(base table)定位和讀取整行數據。

(2) sever層評估where條件,如果該行數據滿足where條件則使用,否則丟棄。

(3)執行第1步,直到最后一行數據。

2)使用ICP時,如何進行索引掃描

(1)storage engine從索引中讀取下一條索引元組。

(2) storage engine使用索引元組評估下推的索引條件。如果沒有滿足where條件,storage engine將會處理下一條索引元組(回到上一步)。只有當索引元組滿足下推的索引條件的時候,才會繼續去基表中讀取數據。

(3)如果滿足下推的索引條件,storage engine通過索引元組定位基表的行和讀取整行數據并返回給server層。

(4)server層評估沒有被下推到storage engine層的where條件,如果該行數據滿足where條件則使用,否則丟棄。

用兩張圖來做說明:

關閉ICP

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

在不支持ICP的系統下,索引僅僅作為data access使用。

開啟ICP

詳解MySQL數據庫的Index Condition Pushdown(ICP)特性

在ICP優化開啟時,在存儲引擎端首先用索引過濾可以過濾的where條件,然后再用索引做data access,被index condition過濾掉的數據不必讀取,也不會返回server端。

責任編輯:華軒 來源: 今日頭條
相關推薦

2010-06-13 10:46:52

MySQL 數據庫

2011-04-11 13:46:17

Oracle數據庫備份

2022-03-29 10:52:08

MySQL數據庫

2010-03-29 10:19:24

2018-07-30 15:00:05

數據庫MySQLJOIN

2011-08-02 15:04:49

2024-07-10 08:00:00

數據庫流式數據庫

2010-05-19 13:37:39

MySQL數據庫密碼

2011-08-30 12:51:19

MySQL線程緩沖池

2010-09-29 08:52:34

MySQL

2011-08-17 17:29:32

Windows編譯MySQL

2010-06-10 17:19:05

MySQL數據庫

2011-09-01 10:56:34

2011-08-30 13:40:28

MySQL線程

2010-01-05 09:24:42

MySQL外鍵約束

2011-08-25 17:49:14

MySQLmysqlcheck

2010-09-08 15:55:20

SQL事務特性

2011-07-05 10:03:00

Qt MYSQL 數據庫

2009-09-07 15:25:24

MySQL數據庫互操作Silverlight

2009-12-31 11:10:01

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区视频在线观看 | 99视频 | 成人1区2区 | 干干干操操操 | 一区在线观看 | 日日干日日操 | 午夜精品久久久久久久久久久久 | 成人一区二区三区 | 三级在线免费观看 | www.黄色在线观看 | 亚洲精品久久久久国产 | 午夜寂寞影院在线观看 | 一区二区三区四区日韩 | 欧美视频中文字幕 | 麻豆久久久9性大片 | 天天操操| 免费国产视频 | 天天综合永久 | 精品一区在线看 | 国产亚洲精品美女久久久久久久久久 | 久久免费观看视频 | 女同av亚洲女人天堂 | 国产视频1区| 久草精品视频 | 人人性人人性碰国产 | www.久久久.com| 久久狠狠 | 久操伊人 | 国产中文区二幕区2012 | 亚洲精品国产a久久久久久 午夜影院网站 | 国产成在线观看免费视频 | 日本久草 | 一区二区三区四区日韩 | 天天看天天操 | 亚洲精品美女视频 | 欧美色综合天天久久综合精品 | 一区二区三区在线播放 | 色毛片| 三级av网址| 国产激情视频网 | 国产三级日本三级 |