1、基本概念
資料讀寫性能主要是IO次數,單次從磁盤讀取單位是頁,即便只讀取一行記錄,從磁盤中也是會讀取一頁的()單頁讀取代價高,一般都會進行預讀)
(1)扇區是磁盤的最小存盤單元
(2)塊是檔案系統的最小存盤單元,比如你保存一個記事本,即使只輸入一個字符,也要占用4KB的存盤,這就是最小存盤的意思
(3)頁是B+樹的最小存盤單元
| 單元 | 誰的(歸屬) | 最小大小 |
|---|---|---|
| 扇區 | 磁盤 | 512B |
| 塊 | 檔案系統 | 4K |
| 頁 | B+ | 16K |
2、有無索引的讀取資料比較
無索引情況下,會直接在磁盤中讀取經過多次IO才能找到需要的資料,首先讀取這個扇區的資料,需要將磁頭放到這個扇區上方,這個程序叫做尋道,花費時間叫做尋道時間,然后磁盤旋轉將目標扇區旋轉到磁頭下,這個程序耗時叫旋轉耗時,磁盤讀取資料時間包含尋道和旋轉時間,
有索引情況下,會讀取索引資料經過幾次IO就能找到需要的資料,下面計算通過索引(B+TREE,主鍵id采用bigint占用8位元組,一行資料占用1KB)計算:
(1)第一層
一個頁16K,每一個索引鍵的大小8位元組(bigint)+6位元組(指標大小),因此第一層可存盤16*1024/14=1170個索引鍵,
(2)第二層
第二層只存盤索引鍵,能存盤多少個索引鍵呢?1170(這么多個頁,有第一層延伸的指標)1170(每頁的索引鍵個數,跟第一步計算一致)=1368900
如果第二層存盤資料呢?1170(這么多個頁,有第一層延伸的指標)16(16KB的頁大小/1KB的資料大小)=18720,也就是能存盤一萬多條數,
(3)第三層
直接看三層能存盤多少資料?1170*1170*16=21902400,是不是很強大,此處應該有掌聲和鮮花,3次IO就可以查詢到2千多萬左右的資料,也就是這么大的資料量如果通過主鍵索引來查找是很快,這就是explain一個sql時,type=const為什么性能是最優的,
3、mysql索引型別
表級別索引設定
(1)應用層:唯一索引,普通索引,復合索引
(2)存盤結構:BTree(BTree或B+Tree)、Hash索引,full-index全文索引,R-Tree索引,
(3)資料物理順序與鍵值邏輯:聚集索引,非聚集索引,
聚集索引的B+Tree中的葉子節點存放的是整張表的行記錄資料,輔助索引與聚集索引的區別在于輔助索引的葉子節點并不包含行記錄的全部資料,而是存盤相應行資料的聚集索引鍵,即主鍵,
聚簇索引是對磁盤上實際資料重新組織以按指定的一個或多個列的值排序的演算法,特點是存盤資料的順序和索引順序一致, 一般情況下主鍵會默認創建聚簇索引,且一張表只允許存在一個聚簇索引,
聚簇索引的葉子節點就是資料節點,而非聚簇索引的葉子節點仍然是索引節點,只不過有指向對應資料塊的指標,
4、B-TREE
(1)特點
B-樹相對B樹,B-樹的各層節點要存盤資料,導致每頁能夠容納的節點就很少,直接導致樹深度加大

(2)實體


5、B+TREE
(1)特點

(2)實體


6、MyISAM的索引結構
MyISAM有三個檔案,.frm,MYD,MYI分別是表結構,表資料,表索引,先查找主鍵值對應的value,然后根據value查找對應的行

7、innodb索引結構
InnoDB存盤引擎就是用B+Tree實作其索引結構,由frm,ibd檔案組成,主鍵索引存盤資料,非主鍵索引存盤主鍵資料


8、innodb和myisam主鍵索引和其他索引區別

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/40029.html
標籤:MySQL
上一篇:PB8是否支持多執行緒操作
