通常來講,索引文件佔用空間比較大, 須要存儲在磁盤上。索引查找須要經過磁盤I/O操做才能進行,而咱們知道,磁盤I/O比內存讀取要高几個數量級,因此如何減小磁盤I/O次數,是索引數據結構選擇的首要參考條件。sql
計算機局部性原理認爲:當一個數據被用到時,其附近的數據也一般會立刻被使用。所以爲了減小磁盤I/O,磁盤每每不是嚴格按需讀取,磁盤會從讀取的這個位置開始,順序向後讀取必定長度的數據放入內存。磁盤一次預讀會讀取頁的整數倍大小的數據。數據結構
B-樹的設計利用了計算機的局部性原理和預讀,每一個節點新建時申請磁盤一頁數據的大小,這樣節點載入和查找只須要一次磁盤I/O。同時B+樹進行了改進,B+樹非葉子節點只用來索引,不存放數據,葉子節點存放完整的數據記錄,且具備指向相鄰葉子節點的指針(方便區間訪問) 。這樣的設計使得B+樹的高度更小,磁盤IO讀寫次數就下降了,同時因爲B+樹的全部數據都存放在葉子節點上,掃庫的話只須要掃一遍葉子節點便可。app
B+樹一個節點的數據大小就是計算機磁盤一頁數據的大小,計算機一頁數據大小爲16k。咱們知道,B+樹的非葉子節點存放的是數據索引,假設Innodb裏設置的指針大小爲6字節,而存儲的索引字段爲bigint類型,長度爲8字節,則對非葉子節點來講,一個節點能夠存儲16384/14=1167個索引;對於葉子節點來講,假設每條記錄大小爲1k,一個節點能夠存儲16k/1k=16個數據。那麼可知,高度爲2的B+樹最多能夠存放1167*16=18672條數據,高度爲3的B+樹最多能夠存放1167*1167*16=21790224條數據。ui