搜尋
首頁資料庫mysql教程Mysql-索引資料結構

Mysql-索引資料結構

Jan 20, 2017 pm 05:03 PM

一.前言:

在我們的生活中,導出可以看到索引效果的應用,如在火車站觀看的車次表、字典的目錄等。它們的作用就是索引的作用,透過不斷的縮小想要獲得資料的範圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是透過同一種查找方式來鎖定資料(字典的A-Z查找)。

生活舉例-搭火車:我去搭火車回老家,如果要坐火車時沒有車次表,最壞的結果我要跑遍每一個火車停靠點才能找到我要坐的火車;但是有了時刻表,我能快速知道我要做的火車在哪裡停靠,可以直接奔向那裡去,而不是一個過去看看是否為我要做的列車,從而加快訪問的速度。這個車次表,就是資料庫的索引。


二.磁碟原理:

這一部分文字理論比較多,看著還頭疼,有興趣也可看看,沒興趣也不影響後邊篇章的閱讀,只要記住本部分的一個結論即可:

讀取資料盡可能的【減少與作業系統I/O互動的次數】。

好了沒興趣的可以跳過了,到下一部分了。

資料庫實現比較複雜,資料保存在磁碟上,而為了提高效能,每次又可以把部分資料讀入記憶體來計算,因為我們知道存取磁碟的成本大概是存取記憶體的十萬倍左右,所以簡單的搜尋樹難以滿足複雜的應用場景。前面提到了存取磁盤,那麼這裡先簡單介紹一下磁碟IO和預讀,磁碟讀取資料靠的是機械運動,每次讀取資料花費的時間可以分為尋道時間、旋轉延遲、傳輸時間三個部分,
    a)·尋道時間:磁臂移動到指定磁軌所需的時間,主流磁碟一般在5ms以下; b)旋轉延遲:就是我們常聽說的磁碟轉速,例如一個磁碟7200轉,表示每分鐘能轉7200次,也就是說1秒鐘能轉120次,旋轉延遲就是1/120/2 = 4.17ms; c).傳輸時間:指的是從磁碟讀出或將資料寫入磁碟的時間,一般在零點幾毫秒,相對於前兩個時間可以忽略。
    (看過一篇很詳細文章:http://wdxtub.com/2016/04/16/thin-csapp-3/)

那麼造訪一次磁碟的時間,即一次磁碟IO的時間約等於5+ 4.17 = 9ms左右,聽起來還挺不錯的,但要知道一台500-MIPS(Million Instructions Per Second每秒百萬指令數)的機器每秒可以執行5億條指令,因為指令依靠的是電的性質,換句話說執行一次IO的時間可以執行40萬條指令,資料庫動輒十萬百萬乃至千萬級數據,每次9毫秒的時間,顯然是個災難。

所以,結論:減少作業系統I/O互動的次數。

(每一次IO讀取的資料我們稱為一頁(page)。具體一頁有多大資料跟作業系統有關,一般為4k或8k,也就是我們讀取一頁內的資料時候,實際上才發生了一次IO)

三.什麼是索引:

在資料庫系統的使用過程當中,資料的查詢是使用最頻繁的一種資料運算。

        最基本的查詢演算法當然是順序查找(linear search),遍歷表然後逐行匹配行值是否等於待查找的關鍵字,其時間複雜度為O(n)。但時間複雜度為O(n)的演算法規模小的表,負載輕的資料庫,也能有好的效能。  但是資料增加的時候,時間複雜度為O(n)的演算法顯然是糟糕的,效能很快就下降了。

       好在電腦科學的發展提供了許多更優秀的查找演算法,例如二分查找(binary search)、二元樹查找(binary tree search)等。如果稍微分析一下會發現,每種查找演算法都只能應用於特定的資料結構之上,例如二分查找要求被檢索資料有序,而二叉樹查找只能應用於二叉查找樹上,但是資料本身的組織結構不可能完全滿足各種資料結構(例如,理論上不可能同時將兩列都按順序進行組織),所以,在資料之外,資料庫系統還維護著滿足特定查找演算法的資料結構,這些資料結構以某種方式引用(指向)數據,這樣就可以在這些數據結構上實現高級查找演算法。這種資料結構,就是索引。


四.MySQL的B-Tree索引(技術上說B+Tree)

好,本篇的核心來了!

在 MySQL 中,主要有四種類型的索引,分別為: B-Tree 索引, Hash 索引, Fulltext 索引和 R-Tree 索引。我們主要分析B-Tree 索引。 ( B:balace 平衡之意,非binary tree 二元樹)

1.詳解b+樹資料結構

Mysql-索引資料結構

上圖,是一顆b+tree,(innodb引擎下的,與myisam引擎下的B+結構又不一樣,說白了就是聚簇索引與非聚簇索引的區別,詳細見:

Mysql-聚簇索引

淺藍色的區塊我們稱為一個磁碟區塊,可以看到每個磁碟區塊包含幾個資料項目(深藍色所示,範圍: [(M/2)-1, M-1] M為總資料)和指標(黃色所示),如磁碟區塊1包含資料項17和35,包含指標P1、P2、P3,P1表示小於17的磁碟區塊,P2表示在17和35之間的磁碟區塊,P3表示大於35的磁碟區塊。不儲存真實的資料(B+的特點),只儲存指引搜尋方向的資料項,如17、35並不真實存在於資料表中。示,如果要查找資料項29,那麼首先會把磁碟區塊1由磁碟加載到內存,此時發生一次IO,在內存中用二分查找確定29在17和35之間,鎖定磁碟塊1的P2指針,內存時間因為非常短(相比磁碟的IO)可以忽略不計,透過磁碟區塊1的P2指標的磁碟位址把磁碟區塊3由磁碟載入到內存,發生第二次IO,29在26和30之間,鎖定磁碟區塊3的P2指針,透過指針載入磁碟區塊8到內存,發生第三次IO,同時記憶體中做二分查找找到29,結束查詢,總計三次IO。 b+樹可以表示百萬的數據,如果上百萬的數據查找只需要三次IO,性能提高將是巨大的,如果沒有索引,每個數據項都要發生一次IO,那麼總共需要百萬次的IO,顯然成本非常非常高。個索引,難不成每個索引下邊都儲存有資料?每張表只能有一個聚集索引,可以有多個輔助索引。

1). 透過上面的分析,我們知道IO次數取決於b+數的高度h,假設當前資料表的資料為N,每個磁碟區塊的資料項的數量是m,則有h=㏒(m +1)N,當資料量N一定的情況下,m越大,h越小;而m = 磁碟區塊的大小/ 資料項的大小,磁碟區塊的大小也就是一個資料頁的大小,是固定的,如果資料項佔的空間越小,資料項的數量越多,樹的高度h越低, I/O也就少。這就是為什麼每個資料項,也就是索引欄位要盡量的小。

舉個反面教材,例如int佔4字節,要比bigint8位元組少一半。這也是為什麼b+樹要求把真實的資料放到葉子節點而不是內層節點,一旦放到內層節點,磁碟塊的資料項會大幅度下降(原理見上邊二),導致樹增高。當資料項等於1時將會退化成線性表。如下:

如果是左邊的結構,I/O次數為三次;如果是右邊的線性表,I/O次數為6次,很明顯嘛IO變多了

映射兩個結論:

1.要設定成索引的字段len要小;

2.做聯合索引時,聯合的字段數也要少

Mysql-索引資料結構

2).當b+樹的資料項是複合的資料結構(多列索引),例如(name,age,sex)的時候,b+數是按照從左到右的順序來建立搜尋樹的。

例如當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來決定下一步的所搜方向,如果name相同再依序比較age和sex,最後得到檢索的數據;但當(20,F)這樣的沒有name的資料來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜尋樹的時候name就是第一個比較因子,必須先根據name來搜尋才能知道下一步要去哪裡查詢。

例如當(張三,F)這樣的資料來檢索時,b+樹可以用name來指定搜尋方向,但下一個字段age的缺失,所以只能把名字等於張三的資料都找到,然後再匹配性別是F的數據了, 這個是非常重要的性質,即索引的最左匹配特性。

映射兩個結論:

1.最左匹配特性,聯合索引是從左往右讀的


2.如果有了多列索引,那麼從左到右一次的索引不需要建立(a,b,c) 那麼(a),(a,b)就不用建立了

3. 更多結論: Mysql-索引總結 http://blog.csdn.net/ty_hf/article/details/53526405

以上就是 Mysql-索引資料結構的內容,更多相關內容請關注PHP中文網(www.php.cn)!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
MySQL索引基數如何影響查詢性能?MySQL索引基數如何影響查詢性能?Apr 14, 2025 am 12:18 AM

MySQL索引基数对查询性能有显著影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。

MySQL:新用戶的資源和教程MySQL:新用戶的資源和教程Apr 14, 2025 am 12:16 AM

MySQL學習路徑包括基礎知識、核心概念、使用示例和優化技巧。 1)了解表、行、列、SQL查詢等基礎概念。 2)學習MySQL的定義、工作原理和優勢。 3)掌握基本CRUD操作和高級用法,如索引和存儲過程。 4)熟悉常見錯誤調試和性能優化建議,如合理使用索引和優化查詢。通過這些步驟,你將全面掌握MySQL的使用和優化。

現實世界Mysql:示例和用例現實世界Mysql:示例和用例Apr 14, 2025 am 12:15 AM

MySQL在現實世界的應用包括基礎數據庫設計和復雜查詢優化。 1)基本用法:用於存儲和管理用戶數據,如插入、查詢、更新和刪除用戶信息。 2)高級用法:處理複雜業務邏輯,如電子商務平台的訂單和庫存管理。 3)性能優化:通過合理使用索引、分區表和查詢緩存來提升性能。

MySQL中的SQL命令:實踐示例MySQL中的SQL命令:實踐示例Apr 14, 2025 am 12:09 AM

MySQL中的SQL命令可以分為DDL、DML、DQL、DCL等類別,用於創建、修改、刪除數據庫和表,插入、更新、刪除數據,以及執行複雜的查詢操作。 1.基本用法包括CREATETABLE創建表、INSERTINTO插入數據和SELECT查詢數據。 2.高級用法涉及JOIN進行表聯接、子查詢和GROUPBY進行數據聚合。 3.常見錯誤如語法錯誤、數據類型不匹配和權限問題可以通過語法檢查、數據類型轉換和權限管理來調試。 4.性能優化建議包括使用索引、避免全表掃描、優化JOIN操作和使用事務來保證數據一致性

InnoDB如何處理酸合規性?InnoDB如何處理酸合規性?Apr 14, 2025 am 12:03 AM

InnoDB通過undolog實現原子性,通過鎖機制和MVCC實現一致性和隔離性,通過redolog實現持久性。 1)原子性:使用undolog記錄原始數據,確保事務可回滾。 2)一致性:通過行級鎖和MVCC確保數據一致。 3)隔離性:支持多種隔離級別,默認使用REPEATABLEREAD。 4)持久性:使用redolog記錄修改,確保數據持久保存。

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)在實際應用中,通過優化查詢和調整隔離級別,可以減少鎖競爭,提高並發性能。

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.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SecLists

SecLists

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)