日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql:好好的索引,为什么要下推?

發布時間:2024/9/15 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql:好好的索引,为什么要下推? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者|萊烏

前段時間有讀者提議講講索引下推,這期就把這事兒安排上。多余的前言就不贅述了,我們直接開始。

列位坐好!

- 思維導圖?-

回表操作

對于數據庫來說,只要涉及到索引,必然繞不過去回表操作。當然這也是我們今天所講內容的前調基礎。

說到回表,我們需要從索引開始說起。別擔心,不會長篇大論,這里只是簡單講下主鍵索引與普通索引,目的是讓大家對回表操作有個認識。如果你對回表操作很熟悉了,那么可以跳過這一段。

這里我們只以 Innodb 存儲引擎作為講解對象。

主鍵索引

主鍵索引在底層的數據存儲是通過 B+ 樹來實現的。簡單來說,就是除葉子節之外的其他節點都存儲的是主鍵值。而葉子節點上存儲的是整行的數據。

大體結構如下圖所示。

非主鍵索引

除了主鍵索引外,其它的索引都被稱為非主鍵索引。與主鍵索引不同的是,非主鍵索引的葉子節點上存儲的是主鍵的值。

那讓我們再回到開始的問題,什么是回表操作?

當我們在非主鍵索引上查找一行數據的時候,此時的查找方式是先搜索非主鍵索引樹,拿到對應的主鍵值,再到主鍵索引樹上查找對應的行數據。

這種操作就叫作回表操作。

好了,這里你應該了解了什么是回表操作了。簡單來講,就是在非主鍵索引樹上拿到對應的主鍵值,然后回到主鍵索引上找到對應的行數據。

這樣做的前提條件是,所要查找的字段不存在于非主鍵索引樹上。

低版本操作

講完了回表操作,讓我們繼續回到這篇文章的主題——索引下推。

其實在 Mysql 5.6 版本之前是沒有索引下推這個功能的,從 5.6 版本后才加上了這個優化項。所以在引出索引下推前還是先回顧下沒有這個功能時是怎樣一種處理方式。

我們以一個真實例子來進行講解。

在這里有張用戶表 user,記錄著用戶的姓名,性別,身高,年齡等信息。表中 id 是自增主鍵,(name,sex) 是聯合索引。在這里用 1 表示男,2 表示女。現在需要查找所有姓王的男性信息。

SQL 實現起來很簡單:

但是它的實現原理是什么呢?

根據聯合索引最左前綴原則,我們在非主鍵索引樹上找到第一個滿足條件的值時,通過葉子節點記錄的主鍵值再回到主鍵索引樹上查找到對應的行數據,再對比是否為當前所要查找的性別。

整個原理可以用下邊的圖進行表示。

看到了吧,低版本中需要每條數據都進行回表,增加了樹的搜索次數。如果遇到所要查找的數據量很大的話,性能必然有所缺失。

高版本操作

講完了低版本操作,讓我們繼續回到這篇文章的主題——索引下推。

知道了痛點,那么怎么解決。很簡單,只有符合條件了再進行回表。結合我們的例子來說就是當滿足了性別 sex = 1 了,再回表查找。這樣原本可能需要進行回表查找 4 次,現在可能只需要 2 次就可以了。

所以本質來說,索引下推就是只有符合條件再進行回表,對索引中包含的字段先進行判斷,不符合條件的跳過。減少了不必要的回表操作。

總結

回表操作

  • 當所要查找的字段不在非主鍵索引樹上時,需要通過葉子節點的主鍵值去主鍵索引上獲取對應的行數據,這個過程稱為回表操作。

索引下推

  • 索引下推主要是減少了不必要的回表操作。對于查找出來的數據,先過濾掉不符合條件的,其余的再去主鍵索引樹上查找。

推薦閱讀 誤執行了rm -fr /*之后,除了跑路還能怎么辦?!程序員必備58個網站匯總大幅提高生產力:你需要了解的十大Jupyter Lab插件

總結

以上是生活随笔為你收集整理的Mysql:好好的索引,为什么要下推?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。