Mysql性能優化:什么是索引下推?

導讀

  • 索引下推(index condition pushdown )簡稱ICP,在Mysql5.6的版本上推出,用于優化查詢。

  • 在不使用ICP的情況下,在使用非主鍵索引(又叫普通索引或者二級索引)進行查詢時,存儲引擎通過索引檢索到數據,然后返回給MySQL服務器,服務器然后判斷數據是否符合條件 。

  • 在使用ICP的情況下,如果存在某些被索引的列的判斷條件時,MySQL服務器將這一部分判斷條件傳遞給存儲引擎,然后由存儲引擎通過判斷索引是否符合MySQL服務器傳遞的條件,只有當索引符合條件時才會將數據檢索出來返回給MySQL服務器 。

  • 索引條件下推優化可以減少存儲引擎查詢基礎表的次數,也可以減少MySQL服務器從存儲引擎接收數據的次數

?

開擼

  • 在開始之前先先準備一張用戶表(user),其中主要幾個字段有:id、name、age、address。建立聯合索引(name,age)

  • 假設有一個需求,要求匹配姓名第一個為陳的所有用戶,sql語句如下:

  SELECT * from user where  name like '陳%'
  • 根據 "最佳左前綴" 的原則,這里使用了聯合索引(name,age)進行了查詢,性能要比全表掃描肯定要高。

  • 問題來了,如果有其他的條件呢?假設又有一個需求,要求匹配姓名第一個字為陳,年齡為20歲的用戶,此時的sql語句如下:

  SELECT * from user where  name like '陳%' and age=20
  • 這條sql語句應該如何執行呢?下面對Mysql5.6之前版本和之后版本進行分析。

?

Mysql5.6之前的版本

  • 5.6之前的版本是沒有索引下推這個優化的,因此執行的過程如下圖:

?

  • 會忽略age這個字段,直接通過name進行查詢,在(name,age)這課樹上查找到了兩個結果,id分別為2,1,然后拿著取到的id值一次次的回表查詢,因此這個過程需要回表兩次

?

Mysql5.6及之后版本

  • 5.6版本添加了索引下推這個優化,執行的過程如下圖:

  • InnoDB并沒有忽略age這個字段,而是在索引內部就判斷了age是否等于20,對于不等于20的記錄直接跳過,因此在(name,age)這棵索引樹中只匹配到了一個記錄,此時拿著這個id去主鍵索引樹中回表查詢全部數據,這個過程只需要回表一次

?

實踐

  • 當然上述的分析只是原理上的,我們可以實戰分析一下,因此陳某裝了Mysql5.6版本的Mysql,解析了上述的語句,如下圖:

  • 根據explain解析結果可以看出Extra的值為Using index condition,表示已經使用了索引下推。

?

總結

  • 索引下推在非主鍵索引上的優化,可以有效減少回表的次數,大大提升了查詢的效率。

  • 關閉索引下推可以使用如下命令,配置文件的修改不再講述了,畢竟這么優秀的功能干嘛關閉呢:

  set optimizer_switch='index_condition_pushdown=off';

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

容斥原理 博弈論(多種Nim游戲解法)

目錄 容斥原理容斥原理的簡介能被整除的數(典型例題)實現思路代碼實現擴展:用DPS實現 博弈論博弈論中的相關性質博弈論的相關結論先手必敗必勝的證明Nim游戲(典型例題)代碼實現 臺階-Nim游戲(典型例題&…

什么叫做云計算

什么叫做云計算 相信大多數人對云計算或者是云服務的認識還停留在僅僅聽過這個名詞,但是對其真正的定義或者意義還不甚了解的層面。甚至有些技術人員,如果日常的業務不涉及到云服務,可能對其也只是一知半解的程度。首先云計算準確的講只是云服…

Java多態詳解(1)

多態 多態的概念 所謂多態,通俗地講,就是多種形態,具體點就是去完成某個行為,當不同的對象去完成時會產生出不同的狀態。 比如: 這一時間爆火的“現代紀錄片”中,麥克阿瑟總是對各種“名人”有不同的評價&…

算法通關村第十關 | 歸并排序

1. 歸并排序原理 歸并排序(MERARE-SORT)簡單來說就是將大的序列先視為若干個比較小的數組,分成比較小的結構,然后是利用歸并的思想實現的排序方法,該算法采用經典的分治策略(分就是將問題分成一些小的問題分…

【Axure模板】APP幫助中心原型,在線客服意見反饋模塊高保真原型

作品概況 頁面數量:共 10 頁 兼容軟件:Axure RP 9/10,不支持低版本 應用領域:原型設計模板 作品申明:頁面內容僅用于功能演示,無實際功能 作品特色 該模板作品為APP幫助與客服的通用模塊,…

golang操作excel的高性能庫——excelize/v2

目錄 介紹文檔與源碼安裝快速開始創建 Excel 文檔讀取 Excel 文檔打開數據流流式寫入 [相關 Excel 開源類庫性能對比](https://xuri.me/excelize/zh-hans/performance.html) 介紹 Excelize是一個純Go編寫的庫,提供了一組功能,允許你向XLAM / XLSM / XLS…

【Kubernetes】Kubernetes的Pod控制器

Pod控制器 一、Pod 控制器的概念1. Pod 控制器及其功用2. Pod 控制器有多種類型2.1 ReplicaSet2.2 Deployment2.3 DaemonSet2.4 StatefulSet2.5 Job2.6 Cronjob 3. Pod 與控制器之間的關系 二、Pod 控制器的使用1. Deployment2. SatefulSet2.1 為什么要有headless?2…

CF113A Grammar Lessons 題解

一道模擬題。 題目傳送門 題目意思: 給你一個句子,讓你檢查這個句子的語法是否正確。(語法請自行在題目中查看) 思路: 就是模擬。依次判斷這個句子是否符合每一條語法即可。但是細節很多就因為細節我錯了好多次&…

數據挖掘 | 零代碼采集房源數據,支持自動翻頁、數據排重等

1 前言 城市規劃、商業選址等應用場景中經常會對地區房價、地域價值進行數據分析,其中地區樓盤房價是分析數據中重要的信息參考點,一些互聯網網站上匯聚了大量房源信息,通過收集此類數據,能夠對地區房價的分析提供參考依據。 如何…

216、仿真-基于51單片機溫度煙霧人體感應布防報警Proteus仿真設計(程序+Proteus仿真+原理圖+配套資料等)

畢設幫助、開題指導、技術解答(有償)見文未 目錄 一、硬件設計 二、設計功能 三、Proteus仿真圖 四、原理圖 五、程序源碼 資料包括: 需要完整的資料可以點擊下面的名片加下我,找我要資源壓縮包的百度網盤下載地址及提取碼。 方案選擇 單片機的選…

SpringBoot 讀取配置文件

Spring Boot 中讀取配置文件有以下 5 種方法: 使用 Value 讀取配置文件。使用 ConfigurationProperties 讀取配置文件。使用 Environment 讀取配置文件。 Autowired private Environment environment; 實現EnvironmentAware接口 使用 PropertySource 讀取配置文件…

Python學習筆記_進階篇(一)_淺析tornado web框架

tornado簡介 1、tornado概述 Tornado就是我們在 FriendFeed 的 Web 服務器及其常用工具的開源版本。Tornado 和現在的主流 Web 服務器框架(包括大多數 Python 的框架)有著明顯的區別:它是非阻塞式服務器,而且速度相當快。得利于…

2023國賽數學建模思路 - 復盤:人力資源安排的最優化模型

文章目錄 0 賽題思路1 描述2 問題概括3 建模過程3.1 邊界說明3.2 符號約定3.3 分析3.4 模型建立3.5 模型求解 4 模型評價與推廣5 實現代碼 建模資料 0 賽題思路 (賽題出來以后第一時間在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 描述 …

衣服材質等整理(時常更新)

參考文章&圖片來源 https://zhuanlan.zhihu.com/p/390341736 00. 天然纖維 01. 化學纖維 02. 聚酯纖維(即,滌綸) 一種由有機二元酸和二元醇通過化學縮聚制成的合成纖維。具有出色的抗皺性和保形性,所制衣物在穿著過程中不容…

Lua + mysql 實戰代碼

--[[luarocks lua語言的包管理器luasql https://luarocks.org/brew install luarocksluarocks install luasql-mysql 注意此處,如果你是 mariadb,然后要求指定 MYSQL_DIR 參數的時候,千萬不要指到 mariadb 的安裝目錄,而是要指…

linux通過NC工具啟動臨時端口監聽

1.安裝nc工具 yum install nc -y2. 啟動監聽指定端口 #例如監聽8080端口 nc -lk 8080#后臺監聽 nc -lk 8080 &3. 驗證 #通過另外一臺網絡能通的機器,telnet 該機器ip 監聽端口能通,并且能接手數據 telnet 192.xxx.xxx.xx 8080

單機編排docker compose

Docker之旅(8)-單機編排docker compose 當在宿主機啟動較多的容器時候,如果都是手動操作會覺得比較麻煩而且容易出錯, 并且每個容器之間也會有先后啟動的順序依賴等。這個時候推薦使用 docker 單機 編排工具 docker-compose,docker-compose …

爬蟲逆向實戰(十四)--某培訓平臺登錄

一、數據接口分析 主頁地址:某培訓平臺 1、抓包 通過抓包可以發現登錄是表單提交到j_spring_security_check 2、判斷是否有加密參數 請求參數是否加密? 通過查看“載荷”模塊可以發現有一個j_password加密參數 請求頭是否加密? 無響應是…

2024浙大MBA/MEM/MPA四個月沖刺備考策略

近期收到很多考生的咨詢:距離聯考就僅剩四個多月的時間,這個管理類聯考的難度如何?主要考些什么內容?現在才開始備考還有希望上岸浙大嗎?是不是要等到明年在開始備考比較合適?那么今天在這里小立老師就跟大…

Docker Dockerfile 使用方法

目錄 Dockerfile 介紹 創建Dockerfile文件 構建 Docker 鏡像 查看已下載的鏡像 運行 mysql 命令 Dockerfile 介紹 當使用Docker構建容器化應用程序時,Dockerfile是一個用于定義容器鏡像的文本文件。它包含了一系列指令,告訴Docker如何從基礎鏡像&a…