索引的樹結構

来源:https://www.cnblogs.com/zz01/archive/2022/07/17/16488082.html
-Advertisement-
Play Games

查找結構的進化 二分查找 二叉樹 二叉平衡樹 B-TREE :二叉平衡樹的基礎上,使載入一次節點,可以載入更多路徑數據,同時把查詢範圍縮減到更小 缺點:業務數據的大小可能遠遠超過了索引數據的大小,每次為了查找對比計算,需要把數據載入到記憶體以及 CPU 高速緩存中時,都要把索引數據和無關的業務數據全部 ...


查找結構的進化

二分查找

二叉樹

二叉平衡樹

B-TREE :二叉平衡樹的基礎上,使載入一次節點,可以載入更多路徑數據,同時把查詢範圍縮減到更小

缺點:業務數據的大小可能遠遠超過了索引數據的大小,每次為了查找對比計算,需要把數據載入到記憶體以及 CPU 高速緩存中時,都要把索引數據和無關的業務數據全部查出來。本來一次就可以把所有索引數據載入進來,現在卻要多次才能載入完。如果所對比的節點不是所查的數據,那麼這些載入進記憶體的業務數據就毫無用處,全部拋棄。

B+TREE:非葉子節點只保存索引數據,葉子節點保存索引數據與業務數據所在的地址

 

  1. B+數據量相同的情況下,非葉子節點可以存放更多的數據,B+樹會更加矮胖,io次數會更少

  2. B+樹有大量的冗餘節點(非葉子結點),會讓B+樹在插入刪除時的效率更高

  3. B+樹的葉子結點用雙向鏈表連了起來,有益於範圍查詢,而B樹只能遍歷。

聚簇索引和非聚簇索引

如果葉子節點存儲的是實際數據的就是聚簇索引,一個表只能有一個聚簇索引;如果葉子節點存儲的不是實際數據,而是主鍵值則就是二級索引,一個表中可以有多個二級索引。

在使用二級索引進行查找數據時,如果查詢的數據能在二級索引找到,那麼就是「索引覆蓋」操作,如果查詢的數據不在二級索引里,就需要先在二級索引找到主鍵值,需要去聚簇索引中獲得數據行,這個過程就叫作「回表」

查詢數據的過程

在定位記錄所在哪一個頁時,也是通過二分法快速定位到包含該記錄的頁。定位到該頁後,又會在該頁內進行二分法快速定位記錄所在的分組(槽號),最後在分組內進行遍歷查找。

磁碟IO

磁碟處理太慢太慢了

  • 儘量減少 I/O 次數,比如可以使用緩存;
  • 每次 I/O 儘量獲取更多的數據;
  • 每次 I/O 儘量獲取有用的數據,當然相應的也間接減少總 I/O 次數

總結:

  • 數據存儲在磁碟( SSD 跟 CPU 性能也不在一個量級),而磁碟處理數據很慢;
  • 提高磁碟性能主要通過減少 I/O 次數,以及單次 I/O 有效數據量;
  • 索引通過多階(一個節點保存多個數據,指向多個子節點)使樹的結構更矮胖,從而減少 I/O 次數;
  • 索引通過 B+ 樹,把業務數據與索引數據分離,來提高單次 I/O 有效數據量,從而減少 I/O 次數;
  • 索引通過樹數據的有序和「二分查找」(多階樹可以假設為多分查找),大大縮小查詢範圍;
  • 索引針對的是單個欄位或部分欄位,數據量本身比一條記錄的數據量要少的多,這樣即使通過掃描的方式查詢索引也比掃描資料庫表本身快的多;

事務

  • 持久性是通過 redo log (重做日誌)來保證的;是物理日誌,記錄做了什麼修改
  • 原子性是通過 undo log(回滾日誌) 來保證的;
  • 一致性是binlog保證的 ,邏輯日誌(有三種格式)statement,row包含操作的具體數據,mixed
  • 隔離性是通過 MVCC(多版本併發控制) 或鎖機制來保證的;

死鎖問題

處理訂單業務時,需要用到select…for update用來避免併發導致的幻讀問題,但是這樣的話就容易出現死鎖

處理方法是破壞形成死鎖的條件:打破迴圈等待條件

  • 設置事務等待鎖的超時時間。當一個事務的等待時間超過該值後,就對這個事務進行回滾,於是鎖就釋放了,另一個事務就可以繼續執行了。在 InnoDB 中,參數 innodb_lock_wait_timeout 是用來設置超時時間的,預設值時 50 秒。
  • 開啟主動死鎖檢測。主動死鎖檢測在發現死鎖後,主動回滾死鎖鏈條中的某一個事務,讓其他事務得以繼續執行。將參數 innodb_deadlock_detect 設置為 on,表示開啟這個邏輯,預設就開啟。

關於count

*count(1)、 count()、 count(主鍵欄位)**在執行的時候,如果表裡存在二級索引,優化器就會選擇二級索引進行掃描。

所以,如果要執行 count(1)、 count(*)、 count(主鍵欄位) 時,儘量在數據表上建立二級索引,這樣優化器會自動採用 key_len 最小的二級索引進行掃描,相比於掃描主鍵索引效率會高一些。

再來,就是不要使用 count(欄位) 來統計記錄個數,因為它的效率是最差的,會採用全表掃描的方式來統計。如果你非要統計表中該欄位不為 NULL 的記錄個數,建議給這個欄位建立一個二級索引。

優化count

如果數據量很大,因為要全表掃描,所以也要花費不短的時間

1.使用explain 出現的rows 欄位值就是 explain 命令對錶 t_order 記錄的估算值。

2.額外表保存記錄值

 

索引失效的情況

  • 當我們使用左或者左右模糊匹配的時候,也就是 like %xx 或者 like %xx% 這兩種方式都會造成索引失效;
  • 當我們在查詢條件中對索引列使用函數,就會導致索引失效。
  • 當我們在查詢條件中對索引列進行表達式計算,也是無法走索引的。
  • MySQL 在遇到字元串和數字比較的時候,會自動把字元串轉為數字,然後再進行比較。如果字元串是索引列,而條件語句中的輸入參數是數字的話,那麼索引列會發生隱式類型轉換,由於隱式類型轉換是通過 CAST 函數實現的,等同於對索引列使用了函數,所以就會導致索引失效。
  • 聯合索引要能正確使用需要遵循最左匹配原則,也就是按照最左優先的方式進行索引的匹配,否則就會導致索引失效。
  • 在 WHERE 子句中,如果在 OR 前的條件列是索引列,而在 OR 後的條件列不是索引列,那麼索引會失效。

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

-Advertisement-
Play Games
更多相關文章
  • 值類型 整數,浮點數,布爾值,字元,枚舉,結構體 引用類型 數組,用戶自定義的類,介面,委托,object,字元串 值類型與引用類型的區別: 存放地址不同,值類型存放在棧中,引用類型存放在堆中。 記憶體分佈: 在程式運行時,記憶體分別為四個區域塊,分別是:堆區,棧區,全局區,代碼區 存放函數內的局部變數 ...
  • 類是模板 對象是基於模板生成的實體 Car表示類,car表示變數,new關鍵字,Car()類的構造方法 Car car = new Car(); 構造方法:new欄位後跟的方法,用於創建一個對象 成員變數:類中聲明的變數稱為這個類的成員變數,類的成員變數需要對象.變數 成員方法:類中聲明的方法稱為這 ...
  • 三目運算符一般用在不是是就是否的結果上,和if else用法基本相似但先比較之下代碼量更上,熟悉過後也是比較容易上手的。 三目運算符 點擊查看代碼 // 獲得二者之間的最小值 public int GetMinValue(int numberA,int numberB){ // 含義:`numebr ...
  • 硬體準備: CH32V103 開發板/核心版, WCH-Link. 軟體準備: 軟體主要是用於編譯的 RISC-V GCC , 和用於燒錄的 OpenOCD., RISC-V GCC 可以選擇公版或者WCH版, OpenOCD 暫時只能用WCH定製版本, 用公版的無法識別 wlink ...
  • Linux系統磁碟管理 磁碟分區,格式化,掛載 可以先添加幾塊硬碟,記住要先關閉虛擬機再添加,此處我添加了四塊硬碟 此處是你當初創建虛擬機的時候選擇的磁碟類型,此處也需要與其一致 選擇創建新的硬碟 將其存儲為單個文件,並選擇大小 成功創建 fdisk分區 //生產分區建議: 如無特殊需求, 直接使用 ...
  • Color Wheel for Mac是一款可直接輸出Web顏色代碼的取色工具,通過方便的Hex/RGB/Float/HSL翻譯提供即時訪問標準Mac OS X的ColorWheel,任何網頁設計師的工具箱都應該有它,將它配置在工具欄上,並打開一個全局熱鍵,使用方便又快捷。 詳情:Color Whe ...
  • 許多有Mac的朋友問,Parallels Desktop 17能不能安裝Windows11呢?可以告訴你,非常的簡單。 如圖,安裝Windows 11出現問題,如圖: 這裡先事先說明一下:安裝win11必須是預覽版的,正式版的win11目前還不可以哦。 具體操作如下: 1、詳情虛擬機(M1和Inte ...
  • 還在尋找一款好用的終端模擬器?ZOC for Mac是一款適用於MAC平臺,眾所周知的telnet/SSH/SSH2客戶端和終端模擬器,ZOC Mac版的功能強大,如標簽會,鍵入命令歷史,回溯,多視窗的支持等等,和落到實處的模擬使它成為人們的首選工具! 詳情:ZOC for Mac(最好用的終端模擬 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...