這篇文章帶給大家的內容是關於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中,存放索引的一個區塊節點佔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 樹的非葉子結點只包含導航訊息,不包含實際的值,所有的葉子結點和相連的節點使用鍊錶相連,便於區間尋找和遍歷。
輔助索引
也稱為非聚集索引,其葉子節點不包含行記錄的全部數據,葉子結點除了包含鍵值以外,每個葉子結點中的索引行還包含一個書籤,該書籤就是對應行的聚集索引鍵。
如下圖可以表示輔助索引和聚集索引的關係(圖片源自網絡,看大概意思即可):
當透過輔助索引來尋找資料時,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中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

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

WebStorm Mac版
好用的JavaScript開發工具

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

Dreamweaver Mac版
視覺化網頁開發工具

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