索引上(4)

来源:https://www.cnblogs.com/jackw1/archive/2020/03/30/12597135.html
-Advertisement-
Play Games

索引 作用:提高數據查詢的效率 常用索引模型 哈希表 有序數組 搜索樹 哈希表 _以鍵值對的形式存儲,適合於只有等值查詢的場景。_ 用一個哈希函數把 換算成一個確定的位置,然後把 這個位置的數組中。一個 會對應一個數組,數組中會有多個 ,`value`並不是有序的。 查找時先通過哈希函數算出 ,找到 ...


索引

作用:提高數據查詢的效率

常用索引模型

  • 哈希表
  • 有序數組
  • 搜索樹

哈希表
以鍵值對的形式存儲,適合於只有等值查詢的場景。
用一個哈希函數把key換算成一個確定的位置,然後把value這個位置的數組中。一個key會對應一個數組,數組中會有多個valuevalue並不是有序的。
查找時先通過哈希函數算出key,找到具體的數組,然後遍曆數組,找到具體的位置。

有序數組
以有序數組形式存儲,等值查詢和範圍查詢場景中性能非常優秀,只適用於靜態存儲引擎。
僅僅看查詢效率,有序數組就是最好的數據結構了,但是,在需要更新數據多的時候就麻煩了,你往中間插入一個記錄就必須得挪動後面所有的記錄,成本太高。
所以,有序數組索引只適用於靜態存儲引擎,比如你要保存2017年某個城市的所有人口信息,這類不會再修改的數據。

搜索樹
以類似二叉樹的多叉樹來實現。

  • 二叉搜索樹:每個節點的左兒子小於父節點,父節點又小於右兒子。
  • 多叉樹:每個節點有多個兒子,兒子之間的大小保證從左到右。

MySQL中,索引是在存儲引擎層實現的,所有並沒有同一的索引標準,即不同存儲引擎的索引的工作方式並不一樣。而即使多個存儲引擎支持同一種類型的索引,其底層的實現也可能不同。

InnoDB使用了B+樹索引模型,所有的數據都是存儲在B+樹中的。每一個索引在InnoDB裡面對應一棵B+樹,主鍵索引對應主B+樹。

  • 主鍵索引:對應主B+樹,葉子節點存儲的是整行數據,也稱為聚簇索引
  • 非主鍵索引:每個非主鍵索引對應一個B+樹,葉子節點存儲的是主鍵的值,也稱為二級索引。

基於主鍵索引和普通索引的查詢的區別?

  • 如果語句是select * from T where ID = 500,主鍵查詢方式,即只需要搜索ID這棵B+樹,葉子節點中有存儲整行數據;
  • 如果語句是select * from T where k = 5,普通索引查詢方式,則需要先搜索k索引樹,得到主鍵ID的值為500,再到主鍵ID索引樹搜索一次,這個過程成為回表。

回到主鍵索引樹搜索的過程,我們稱為回表。

也就是說:基於非主鍵索引的查詢需要多掃描一顆索引樹。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mysql的innodb引擎本身存儲的形式就必須是聚簇索引的形式 , 在磁碟上樹狀存儲的 , 但是不一定是根據主鍵聚簇的 , 有三種情形: 1. 有主鍵的情況下 , 主鍵就是聚簇索引 2. 沒有主鍵的情況下 , 第一個非空null的唯一索引就是聚簇索引 3. 如果上面都沒有 , 那麼就是有一個隱藏的 ...
  • 在上一篇文章中,通過分析執行計劃的欄位說明,大體說了一下索引優化過程中的一些註意點,那麼如何才能避免索引失效呢?本篇文章將來討論這個問題。 避免索引失效的常見方法 1.對於複合索引的使用,應按照索引建立的順序使用,儘量不要跨列(最佳左首碼原則) 為了說明問題,我們仍然使用上一篇文章中的test01表 ...
  • 前言 研究SQL性能問題,其實本質就是優化索引,而優化索引,一個非常重要的工具就是執行計劃(explain),它可以模擬SQL優化器執行SQL語句,從而讓開發人員知道自己編寫的SQL的運行情況。 執行計劃語法 執行計劃的語法非常簡單,就是在要執行的SQL語句前加上 即可。 以我們在上一篇文章中創建的 ...
  • SQL為什麼需要優化? 對於初學者來說,能夠寫出實現功能的SQL語句而不出錯,查詢出所需要的結果,就已經能夠滿足日常使用了。但在某些場景,對性能的要求比較高,因此,要求SQL的執行響應速度快,就需要對SQL進行一定程度的優化。 在實際應用場景中,MySQL經常會存在諸如性能低、執行時間過長、等待時間 ...
  • `MySQL`的行鎖在引擎層由各個引擎自己實現的,但並不是所有的引擎都支持行鎖。 不支持行鎖意味著併發控制只能使用表鎖,對於這種引擎的表,同一張表任何時刻只能有一個更新在執行,這會影響到業務併發度。 引擎下的事務中,行鎖是需要的時候才加上的,但並不是不需要了立刻釋放,而是要等到事務結束時(commi ...
  • 上一篇文章主要介紹了MySQL在Ubuntu18.04系統上的安裝,以及安裝過程中可能會遇到的一些問題的解決方案。 在這篇文章里,開始介紹MySQL資料庫的邏輯分層。通過本文的介紹,可以大致瞭解到MySQL的語句從客戶端發出請求後,在伺服器經歷了怎樣的過程。有助於後面MySQL優化的加深理解。 My ...
  • 註意: 本文操作環境為win10系統wsl下的Ubuntu18.04,對於原生的Ubuntu18.04同樣適用。MySQL預設版本為5.7,其他版本不適用。 安裝步驟 1.更新源: 2.安裝mysql: wsl下使用上述命令安裝就直接安裝上去了,沒有設置密碼的地方,這時候無論怎麼登陸,都無法登錄上去 ...
  • 在下列表T中,執行 ,需要執行幾次樹的搜索操作? 語句執行流程: 1. 在k索引樹上找到k值為3的記錄,取得ID為300 2. 再到ID索引樹上找到ID為300對應的R3記錄 3. 在k索引樹上找到k值為5的記錄,取得ID為500 4. 再回到ID索引樹上找到ID為500對應的R4記錄 5. 在k索 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...