濮阳杆衣贸易有限公司

主頁 > 知識庫 > MySQL索引下推(ICP)的簡單理解與示例

MySQL索引下推(ICP)的簡單理解與示例

熱門標(biāo)簽:大眾點(diǎn)評星級酒店地圖標(biāo)注 云南電商智能外呼系統(tǒng)價(jià)格 臨清電話機(jī)器人 拉卡拉外呼系統(tǒng) 400電話可以辦理嗎 外東北地圖標(biāo)注 話務(wù)外呼系統(tǒng)怎么樣 智能外呼系統(tǒng)復(fù)位 高清地圖標(biāo)注道路

前言

索引下推(Index Condition Pushdown, 簡稱ICP)是MySQL 5.6 版本的新特性,它能減少回表查詢次數(shù),提升檢索效率。

MySQL體系結(jié)構(gòu)

要明白索引下推,首先要了解MySQL的體系結(jié)構(gòu):

上圖來自MySQL官方文檔。

通常把MySQL從上至下分為以下幾層:

  • MySQL服務(wù)層:包括NoSQL和SQL接口、查詢解析器、優(yōu)化器、緩存和Buffer等組件。
  • 存儲引擎層:各種插件式的表格存儲引擎,實(shí)現(xiàn)事務(wù)、索引等各種存儲引擎相關(guān)的特性。
  • 文件系統(tǒng)層: 讀寫物理文件。

MySQL服務(wù)層負(fù)責(zé)SQL語法解析、觸發(fā)器、視圖、內(nèi)置函數(shù)、binlog、生成執(zhí)行計(jì)劃等,并調(diào)用存儲引擎層去執(zhí)行數(shù)據(jù)的存儲和檢索?!八饕峦啤钡摹跋隆逼鋵?shí)就是指將部分上層(服務(wù)層)負(fù)責(zé)的事情,交給了下層(存儲引擎)去處理。

索引下推案例

假設(shè)用戶表數(shù)據(jù)和結(jié)構(gòu)如下:

id age birthday name
1 18 01-01 User1
2 19 03-01 User2
3 20 03-01 User3
4 21 03-01 User4
5 22 05-01 User5
6 18 06-01 User6
7 24 01-01 User7

創(chuàng)建一個(gè)聯(lián)合索引(age, birthday),并查詢出年齡>20,且生日為03-01的用戶:

select * from user where age>20 and birthday="03-01"

由于age字段使用了范圍查詢,根據(jù)最左前綴原則,這種情況只能使用age字段進(jìn)行范圍查詢,索引中的birthday字段無法使用。使用explain查看執(zhí)行計(jì)劃:

+------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+
| id   | select_type | table | type  | possible_keys | key          | key_len | ref  | rows | Extra                 |
+------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+
|    1 | SIMPLE      | user  | range | age_birthday  | age_birthday | 4       | NULL | 3    | Using index condition |
+------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+

可以看到雖然使用了age_birthday索引,但是索引長度key_len只有4,說明只有聯(lián)合索引只有age字段生效了(因?yàn)閍ge字段是int類型,占用4個(gè)字節(jié))。最后Extra列的Using index condition表示這個(gè)查詢使用了索引下推優(yōu)化。

為在沒有索引下推的情況下,執(zhí)行步驟如下:

  • 存儲引擎根據(jù)索引查找出age>20的用戶id,分別是:4,5,7
  • 存儲引擎到表格中取出id in (4,5,7)的3條記錄,返回給服務(wù)層
  • 服務(wù)層過濾掉不符合birthday="03-01"條件的記錄,最后返回查詢結(jié)果為id=4的1行記錄。

如果開啟了索引下推優(yōu)化,執(zhí)行步驟如下:

  1. 存儲引擎根據(jù)索引查找出age>20的用戶id,并使用索引中的birthday字段過濾掉不符合birthday="03-01"條件的記錄,最后得到id=4;
  2. 存儲引擎到表格中取出id=4的1條記錄,返回給服務(wù)層;
  3. 服務(wù)層過濾掉不符合birthday="03-01"條件的記錄,最后返回查詢結(jié)果為id=4的1行記錄。

啟用索引下推后,把where條件由MySQL服務(wù)層放到了存儲引擎層去執(zhí)行,帶來的好處就是存儲引擎根據(jù)id到表格中讀取數(shù)據(jù)的次數(shù)變少了。在上面這個(gè)例子中,沒有索引下推時(shí)需要多回表查詢2次。并且回表查詢很可能是離散IO,在某些情況下,對數(shù)據(jù)庫性能會有較大提升。

總結(jié)

到此這篇關(guān)于MySQL索引下推(ICP)的簡單理解與示例的文章就介紹到這了,更多相關(guān)MySQL索引下推(ICP)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 五分鐘帶你搞懂MySQL索引下推
  • 一篇文章讀懂什么是MySQL索引下推(ICP)
  • 五分鐘讓你快速弄懂MySQL索引下推
  • MySQL帶你秒懂索引下推

標(biāo)簽:無錫 福州 揚(yáng)州 阿里 山西 三明 定西 溫州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL索引下推(ICP)的簡單理解與示例》,本文關(guān)鍵詞  MySQL,索引,下推,ICP,的,簡單,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL索引下推(ICP)的簡單理解與示例》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL索引下推(ICP)的簡單理解與示例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    邹城市| 临沂市| 涟水县| 花莲县| 巍山| 永吉县| 长顺县| 星子县| 海原县| 厦门市| 双鸭山市| 汝州市| 封开县| 鲜城| 宣武区| 南川市| 泾源县| 垣曲县| 正镶白旗| 伽师县| 东辽县| 南漳县| 泸水县| 达拉特旗| 万全县| 吕梁市| 桃园市| 玉田县| 泾源县| 城口县| 惠安县| 贵溪市| 汉阴县| 毕节市| 庆元县| 达拉特旗| 华宁县| 长乐市| 治县。| 永登县| 牙克石市|