搜尋
首頁資料庫mysql教程mysql innodb索引原理的詳細介紹(程式碼範例)

mysql innodb索引原理的詳細介紹(程式碼範例)

Mar 04, 2019 pm 03:06 PM
mysql儲存過程資料庫查詢最佳化索引

這篇文章帶給大家的內容是關於mysql innodb索引原理的詳細介紹(程式碼範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

聚集索引(clustered index)

innodb儲存引擎表是索引組織表,表中資料依照主鍵順序存放。其聚集索引就是依照每張表的主鍵順序建構一顆B 樹,其葉子結點中存放的就是整張表的行記錄數據,這些葉子節點成為數據頁。 (相關推薦:MySQL教學

聚集索引的儲存並不是物理上連續的,而是邏輯上連續的,葉子結點間依照主鍵順序排序,透過雙向鍊錶連接。多數情況下,查詢優化器傾向於採用聚集索引,因為聚集索引能在葉子結點直接找到數據,並且因為定義了數據的邏輯順序,能特別快的訪問針對範圍值的查詢。

聚集索引的這個特性決定了索引組織表中的資料也是索引的一部分。由於表裡的資料只能依照一顆B 樹排序,因此一張表只能有一個聚集索引。

在Innodb中,叢集索引預設就是主鍵索引。如果沒有主鍵,則依照下列規則來建立叢集索引:

  • 沒有主鍵時,會用非空且唯一的索引列做為主鍵,成為此資料表的叢集索引;
  • 如果沒有這樣的索引,InnoDB會隱式定義一個主鍵來作為叢集索引。

由於主鍵使用了叢集索引,如果主鍵是自增id,那麼對應的資料也會相鄰地存放在磁碟上,寫入效能較高。如果是uuid等字串形式,頻繁的插入會使innodb頻繁地移動磁碟區塊,寫入效能就比較低了。

B 樹(多路平衡查找樹)

我們知道了innodb引擎索引使用了B 樹結構,那麼為什麼不是其他類型樹結構,例如二元樹呢?

電腦在儲存資料的時候,有最小儲存單元,這就好比人民幣流通最小單位是分一樣。檔案系統的最小單元是區塊,一個區塊的大小是4k(這個值根據系統不同且可設定),InnoDB儲存引擎也有自己的最小儲存單元—頁(Page),一個頁的大小是16K(這個值也是可設定的)。

檔案系統中一個檔案大小只有1個字節,但不得不佔磁碟上4KB的空間。同理,innodb的所有資料檔的大小始終都是16384(16k)的整數倍。

mysql innodb索引原理的詳細介紹(程式碼範例)

所以在MySQL中,存放索引的一個區塊節點佔16k,mysql每次IO操作會利用系統的預讀能力一次載入16K。這樣,如果這一個節點只放1個索引值是非常浪費的,因為一次IO只能取得一個索引值,所以不能使用二元樹。

B 樹是多路查找樹,一個節點能放n個值,n = 16K / 每個索引值的大小。
例如索引字段大小1Kb,這時候每個節點能放的索引值理論上是16個,這種情況下,二叉樹一次IO只能載入一個索引值,而B 樹則能載入16個。

B 樹的路數為n 1,n是每個節點存在的值數量,例如每個節點存放16個值,那麼這棵樹就是17路。

從這裡也能看出,B 樹節點可儲存多個值,所以B 樹索引並不能找到一個給定鍵值的具體行。 B 樹只能找到存放資料行的具體頁,然後把頁讀入記憶體中,再在記憶體中找出指定的資料。

附:B樹和B 樹的區別在於,B 樹的非葉子結點只包含導航訊息,不包含實際的值,所有的葉子結點和相連的節點使用鍊錶相連,便於區間尋找和遍歷。

輔助索引

也稱為非聚集索引,其葉子節點不包含行記錄的全部數據,葉子結點除了包含鍵值以外,每個葉子結點中的索引行還包含一個書籤,該書籤就是對應行的聚集索引鍵。

如下圖可以表示輔助索引和聚集索引的關係(圖片源自網絡,看大概意思即可):

mysql innodb索引原理的詳細介紹(程式碼範例)

當透過輔助索引來尋找資料時,innodb儲存引擎會透過輔助索引葉子節點取得只想主鍵索引的主鍵,既然後再透過主鍵索引找到完整的行記錄。

例如在一棵高度為3的輔助索引樹中查找數據,那需要對這顆輔助索引樹進行3次IO找到指定主鍵,如果聚集索引樹的高度同樣為3,那麼還需要對聚集索引樹進行3次查找,最終找到一個完整的行資料所在的頁,因此一共需要6次IO存取來得到最終的資料頁。

所建立的索引,如聯合索引、唯一索引等,都屬於非叢集索引。

聯合索引

聯合索引是指將資料表上的多個資料列進行索引。聯合索引也是一顆B 樹,不同的是聯合索引的鍵值數量不是1,而是大於等於2。

例如有user表,欄位為id,age,name,現發現如下兩個sql使用頻率最多:

Select * from user where age = ? ;
Select * from user where age = ? and name = ?;

這時候不需要為age和name單獨建立兩個索引,只需要建立如下一個聯合索引即可:

create index idx_age_name on user(age, name)

聯合索引的另一個好處已經對第二個鍵值進行了排序處理,有時可以避免多一次的排序操作。

會覆寫索引

覆寫索引,也就是從輔助索引就可以得到查詢所需的所有欄位值,而不需要查詢聚集索引中的記錄。覆蓋索引的好處是輔助索引不包含整行記錄的所有信息,故其大小要遠小於聚集索引,因此可以減少大量的IO操作。

例如上面有聯合索引(age,name),如果如下:

select age,name from user where age=?

就能使用覆蓋索引了。

覆蓋索引的另一個好處是對於統計問題,例如:

select count(*) from user

innodb儲存引擎並不會選擇透過查詢聚集索引來進行統計。由於user表上也有輔助索引,而輔助索引遠小於聚集索引,選擇輔助索引可以減少IO運算。

注意事項

  • 索引只建合適的,不建造多餘的
因為每當增刪資料時,B 樹都要調整,如果建立多個索引,多個B 樹都要調整,而樹越多、結構越龐大,這個調整就越耗時耗資源。如果減少了這些不必要的索引,磁碟的使用率可能會大大降低。
  • 索引列的資料長度能少則少。

索引資料長度越小,每個區塊中儲存的索引數量越多,一次IO取得的值更多。

  • 符合列前綴可用到索引like 9999%,like �99%、like �99用不到索引;
  • Where 條件中in和or可以使用索引, not in 和操作無法使用索引;

如果是not in或,面對B 樹,引擎根本不知道應該從哪個節點入手。

  • 符合範圍值,order by 也可用到索引;
  • 多用指定列查詢,只傳回自己想到的資料列,少用select *;

不需要查詢無用字段,並且不使用*可能還會命中覆蓋索引哦;

  • #聯合索引中如果不是按照索引最左列開始查找,無法使用索引;

最左匹配原則;

  • 聯合索引中精確匹配最左前列並範圍匹配另外一列可以用到索引;
  • 聯合索引中如果查詢中有某個列的範圍查詢,則其右邊的所有列都無法使用索
#

以上是mysql innodb索引原理的詳細介紹(程式碼範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
MySQL的位置:數據庫和編程MySQL的位置:數據庫和編程Apr 13, 2025 am 12:18 AM

MySQL在數據庫和編程中的地位非常重要,它是一個開源的關係型數據庫管理系統,廣泛應用於各種應用場景。 1)MySQL提供高效的數據存儲、組織和檢索功能,支持Web、移動和企業級系統。 2)它使用客戶端-服務器架構,支持多種存儲引擎和索引優化。 3)基本用法包括創建表和插入數據,高級用法涉及多表JOIN和復雜查詢。 4)常見問題如SQL語法錯誤和性能問題可以通過EXPLAIN命令和慢查詢日誌調試。 5)性能優化方法包括合理使用索引、優化查詢和使用緩存,最佳實踐包括使用事務和PreparedStatemen

MySQL:從小型企業到大型企業MySQL:從小型企業到大型企業Apr 13, 2025 am 12:17 AM

MySQL適合小型和大型企業。 1)小型企業可使用MySQL進行基本數據管理,如存儲客戶信息。 2)大型企業可利用MySQL處理海量數據和復雜業務邏輯,優化查詢性能和事務處理。

幻影是什麼讀取的,InnoDB如何阻止它們(下一個鍵鎖定)?幻影是什麼讀取的,InnoDB如何阻止它們(下一個鍵鎖定)?Apr 13, 2025 am 12:16 AM

InnoDB通過Next-KeyLocking機制有效防止幻讀。 1)Next-KeyLocking結合行鎖和間隙鎖,鎖定記錄及其間隙,防止新記錄插入。 2)在實際應用中,通過優化查詢和調整隔離級別,可以減少鎖競爭,提高並發性能。

mysql:不是編程語言,而是...mysql:不是編程語言,而是...Apr 13, 2025 am 12:03 AM

MySQL不是一門編程語言,但其查詢語言SQL具備編程語言的特性:1.SQL支持條件判斷、循環和變量操作;2.通過存儲過程、觸發器和函數,用戶可以在數據庫中執行複雜邏輯操作。

MySQL:世界上最受歡迎的數據庫的簡介MySQL:世界上最受歡迎的數據庫的簡介Apr 12, 2025 am 12:18 AM

MySQL是一種開源的關係型數據庫管理系統,主要用於快速、可靠地存儲和檢索數據。其工作原理包括客戶端請求、查詢解析、執行查詢和返回結果。使用示例包括創建表、插入和查詢數據,以及高級功能如JOIN操作。常見錯誤涉及SQL語法、數據類型和權限問題,優化建議包括使用索引、優化查詢和分錶分區。

MySQL的重要性:數據存儲和管理MySQL的重要性:數據存儲和管理Apr 12, 2025 am 12:18 AM

MySQL是一個開源的關係型數據庫管理系統,適用於數據存儲、管理、查詢和安全。 1.它支持多種操作系統,廣泛應用於Web應用等領域。 2.通過客戶端-服務器架構和不同存儲引擎,MySQL高效處理數據。 3.基本用法包括創建數據庫和表,插入、查詢和更新數據。 4.高級用法涉及復雜查詢和存儲過程。 5.常見錯誤可通過EXPLAIN語句調試。 6.性能優化包括合理使用索引和優化查詢語句。

為什麼要使用mysql?利益和優勢為什麼要使用mysql?利益和優勢Apr 12, 2025 am 12:17 AM

選擇MySQL的原因是其性能、可靠性、易用性和社區支持。 1.MySQL提供高效的數據存儲和檢索功能,支持多種數據類型和高級查詢操作。 2.採用客戶端-服務器架構和多種存儲引擎,支持事務和查詢優化。 3.易於使用,支持多種操作系統和編程語言。 4.擁有強大的社區支持,提供豐富的資源和解決方案。

描述InnoDB鎖定機制(共享鎖,獨家鎖,意向鎖,記錄鎖,間隙鎖,下一鍵鎖)。描述InnoDB鎖定機制(共享鎖,獨家鎖,意向鎖,記錄鎖,間隙鎖,下一鍵鎖)。Apr 12, 2025 am 12:16 AM

InnoDB的鎖機制包括共享鎖、排他鎖、意向鎖、記錄鎖、間隙鎖和下一個鍵鎖。 1.共享鎖允許事務讀取數據而不阻止其他事務讀取。 2.排他鎖阻止其他事務讀取和修改數據。 3.意向鎖優化鎖效率。 4.記錄鎖鎖定索引記錄。 5.間隙鎖鎖定索引記錄間隙。 6.下一個鍵鎖是記錄鎖和間隙鎖的組合,確保數據一致性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。