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