前面我寫了幾篇關於 mysql 索引的文章,索引是 mysql 很是重要的一部分。你也可能常常會看到一些關於 mysql 軍規、mysql 查詢優化的文章,其實這些操做的背後都是基於必定的原理的,你要想明白這些原理,首先就得知道 mysql 底層的一些東西。mysql
我在這裏舉幾個例子吧。sql
咱們都知道表的主鍵通常都要使用自增 id,不建議使用業務 id ,是由於使用自增 id 能夠避免頁分裂。這個其實能夠至關於一個結論,你均可以直接記住這個結論就能夠了。 可是若是你要弄明白什麼是頁分裂,或者什麼狀況下會頁分裂,這個時候你就須要對 mysql 的底層數據結構要有必定的理解了。數據結構
我這裏也稍微解釋一下頁分裂,mysql (注意本文講的 mysql 默認爲InnoDB 引擎)底層數據結構是 B+ 樹,所謂的索引其實就是一顆 B+ 樹,一個表有多少個索引就會有多少顆 B+ 樹,mysql 中的數據都是按順序保存在 B+ 樹上的(因此說索引自己是有序的)。post
而後 mysql 在底層又是以數據頁爲單位來存儲數據的,一個數據頁大小默認爲 16k,固然你也能夠自定義大小,也就是說若是一個數據頁存滿了,mysql 就會去申請一個新的數據頁來存儲數據。mysql索引
若是主鍵爲自增 id 的話,mysql 在寫滿一個數據頁的時候,直接申請另外一個新數據頁接着寫就能夠了。優化
若是主鍵是非自增 id,爲了確保索引有序,mysql 就須要將每次插入的數據都放到合適的位置上。索引
當往一個快滿或已滿的數據頁中插入數據時,新插入的數據會將數據頁寫滿,mysql 就須要申請新的數據頁,而且把上個數據頁中的部分數據挪到新的數據頁上。get
這就形成了頁分裂,這個大量移動數據的過程是會嚴重影響插入效率的。效率
其實對主鍵 id 還有一個小小的要求,在知足業務需求的狀況下,儘可能使用佔空間更小的主鍵 id,由於普通索引的葉子節點上保存的是主鍵 id 的值,若是主鍵 id 佔空間較大的話,那將會成倍增長 mysql 空間佔用大小。原理
原本這篇文章是打算總結一下前面寫的幾篇關於 mysql 索引的文章的,也是打算多舉幾個例子的,結果發現光寫了一個自增主鍵就寫了一大堆了,而後時間也比較晚了,乾脆就寫到這吧,本來計劃的幾個其餘例子後面再單獨寫吧。
若是你對 B+ 樹不是很清楚的話,建議你去看下我下面這幾篇推薦文章,歡迎關注。
推薦文章: