人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

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

發(fā)布日期:2022-02-07 11:30 | 文章來源:腳本之家

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

MySQL體系結構

要明白索引下推,首先要了解MySQL的體系結構:

上圖來自MySQL官方文檔。

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

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

MySQL服務層負責SQL語法解析、觸發(fā)器、視圖、內置函數(shù)、binlog、生成執(zhí)行計劃等,并調用存儲引擎層去執(zhí)行數(shù)據(jù)的存儲和檢索?!八饕峦啤钡摹跋隆逼鋵嵕褪侵笇⒉糠稚蠈樱ǚ諏樱┴撠煹氖虑?,交給了下層(存儲引擎)去處理。

索引下推案例

假設用戶表數(shù)據(jù)和結構如下:

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)建一個聯(lián)合索引(age, birthday),并查詢出年齡>20,且生日為03-01的用戶:

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

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

+------+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+
| 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字段生效了(因為age字段是int類型,占用4個字節(jié))。最后Extra列的Using index condition表示這個查詢使用了索引下推優(yōu)化。

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

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

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

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

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

總結

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

美國穩(wěn)定服務器

版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部