91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中的聚簇索引、非聚簇索引、聯合索引和唯一索引是什么

發布時間:2023-04-19 14:15:54 來源:億速云 閱讀:149 作者:iii 欄目:MySQL數據庫

今天小編給大家分享一下MySQL中的聚簇索引、非聚簇索引、聯合索引和唯一索引是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    一、索引類型

    索引根據底層實現可分為B-Tree索引和哈希索引,大部分時候我們使用的都是B-Tree索引,因為它良好的性能和特性更適合于構建高并發系統。

    根據索引的存儲方式來劃分,索引可以分為聚簇索引和非聚簇索引。聚簇索引的特點是葉子節點包含了完整的記錄行,而非聚簇索引的葉子節點只有所以字段和主鍵ID。

    根據聚簇索引和非聚簇索引還能繼續下分還能分為普通索引、覆蓋索引、唯一索引以及聯合索引等。

    二、聚簇索引和非聚簇索引

    聚簇索引也叫聚集索引,它實際上并不是一種單獨的索引類型,而是一種數據存儲方式,聚簇索引的葉子節點保存了一行記錄的所有列信息。也就是說,聚簇索引的葉子節點中,包含了一個完整的記錄行。

    非聚簇索引也叫輔助索引、普通索引,它的葉子節點只包含一個主鍵值,通過非聚簇索引查找記錄要先找到主鍵,然后通過主鍵再到聚簇索引中找到對應的記錄行,這個過程被稱為回表。

    例如一個包含了用戶姓名和年齡的的數據表,假設主鍵是用戶ID,聚簇索引的結構為(橙色的代表id,綠色是指向子節點的指針):

    MySQL中的聚簇索引、非聚簇索引、聯合索引和唯一索引是什么

    葉子節點中,為了突出記錄,把(id, name, age)區分開來了,實際上是連在一起的,它們是構成一條記錄的整體。

    而一個非聚簇索引(以age為索引)的結構是:

    MySQL中的聚簇索引、非聚簇索引、聯合索引和唯一索引是什么

    它的葉子節點中,不包含整個記錄的完整信息,除了age字段本身以外,只包含當前記錄的主鍵id。如果想要獲取整行記錄數據還需要再通過id號到聚簇索引中回表查詢。

    InnoDB中,每個表必須有一個聚簇索引,默認是根據主鍵建立的。如果表中沒有主鍵,InnoDB會選擇一個合適的列作為聚簇索引,如果找不到合適的列,會使用一列隱藏的列DB_ROW_ID作為聚簇索引。

    三、覆蓋索引

    非聚簇索引中因為不含有完整的數據信息,查找完整的數據記錄需要回表,所以一次查詢操作實際上要做兩次索引查詢。而如果所有的索引查詢都要經過兩次才能查到,那么肯定會引起效率下降,畢竟能少查一次就少查一次。

    以上面的age索引為例,它是一個非聚簇索引,如果我想通過年齡查詢用戶的id,執行了下面一條語句:

    1

    select id from userinfo where age = 10;

    這種情況是否還有必要去回表?因為我只需要id的值,通過age這個索引就已經能拿到id了,如果還去回表一次不就做了無用的操作了嗎?實際上確實是不需要的。索引查詢中,如果輔助索引已經能夠得到查詢的所有信息了,就無需再回表,這個就是覆蓋索引。

    四、聯合索引

    聯合索引指的是同時對多列創建的索引,創建聯合索引后,葉子節點會同時包含每個索引列的值,并且同時根據多列排序,這個排序和我們所理解的字典序類似。

    例如對同時對上面的姓名和年齡創建的索引結構:

    MySQL中的聚簇索引、非聚簇索引、聯合索引和唯一索引是什么

    (name, age)都是簡寫,想不出十幾個名字。

    每個葉子節點同時保存了所有的索引列,除此之外,還是只包含了主鍵id。

    最左前綴匹配原則

    當對多列創建索引后,并不是只要包含了創建索引的列就能使用索引,索引的使用要遵循最左前綴匹配原則。

    假設對列(A, B, C)創建索引,那么只有以下場景能使用索引:

    • 對列(A, B, C)/(A, C)或者(A, B)進行查詢會匹配索引,對(C, A)或者(B, C)來說不能使用索引。

    • 通配符只能使用LIKE 'val%'形式,不能使用LIKE '%VAL%',后者會導致全表掃描。

    • 索引列不能進行運算,例如WHERE A + 1 = 5這種場景會導致索引失效。

    • 索引列不能包含范圍值查詢,如LIKE/BETWEEN/>/<等都會導致后面的列無法匹配索引。

    • 索引列不能包含有NULL值。

    索引下推

    新版本的MySQL(5.6以上)中引入了索引下推的機制:可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。

    例如針對上面表中的(name, age)做聯合索引,正常情況下的查詢邏輯:

    • 通過name找到對應的主鍵ID

    • 根據id記錄的列匹配age條件

    這種做法會導致很多不必要的回表,例如表中存在(張三, 10)和(張三, 15)兩條記錄,此刻要查詢(張三, 20)的記錄。查詢時先通過張三定位到所有符合條件的主鍵ID,然后在聚簇索引中遍歷滿足條件的行,看是否有符合age = 20的記錄。實際情況是沒有滿足條件的記錄的,這個回表過程也相當于是在做無用之功。

    索引下推的主要功能就是改善這一點,在聯合索引中,先通過姓名和年齡過濾掉不用回表的記錄,然后再回表查詢索引,減少回表次數。

    五、唯一索引

    唯一索引是一種不允許具有相同索引值的索引,系統在創建該索引時檢查是否有重復的鍵值,每次對更新或增加記錄時都會檢查這一點。主鍵索引就是唯一索引。

    以上就是“MySQL中的聚簇索引、非聚簇索引、聯合索引和唯一索引是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    海阳市| 鹰潭市| 盐山县| 化德县| 建瓯市| 红安县| 合肥市| 宁河县| 尖扎县| 伊金霍洛旗| 溧阳市| 鄂托克旗| 长兴县| 罗山县| 邓州市| 广河县| 富宁县| 靖西县| 民县| 湘西| 荔浦县| 庆阳市| 屏东市| 玛纳斯县| 胶州市| 犍为县| 嘉黎县| 五台县| 敦化市| 东辽县| 石楼县| 富锦市| 抚松县| 肃北| 夏津县| 凤台县| 获嘉县| 安仁县| 远安县| 杭锦旗| 康定县|