MySQL索引的數據結構怎麼選?

  日常工作中,SQL查詢效率比較低的時候,我們想到的第一個解決方案就是增加索引,那什麼是索引?索引有哪些數據結構?索引是怎樣工作的?我們來一一剖析.
一.什麼是索引?
  精煉成一句話:索引是爲了加快查詢效率的排好序的數據結構.這句話有幾個重點,首先,索引的作用是爲了加快查詢效率,其次,索引是一種數據結構,而且是排好序的數據結構.
二.索引有哪些數據結構?
MySQL主要提供的是hash,B+TREE,我們主要使用的是B+TREE,它們的特性如下:
hash: 以鍵值對存儲的數據結構,用hash函數將key換算成一個確切的位置,然後把value放在數據的這個位置上,如果出現hash衝突,那就在這個位置上拉出一個鏈表.用hash做索引的一個好處就是查詢效率特別高,但缺點也同樣明顯,就是隻能做等值查詢,例如Memcached及其他一些NoSQL引擎.
搜索樹: 最基礎的搜索樹就是二叉樹了,它的特點是:每個節點的左兒子節點小於父節點,父節點又小於右兒子節點.它的查詢效率是非常高的(類似於二分法查找,每次過濾一半),維持這個平衡二叉樹的時間複雜度也是O(log(N)).既然有二叉樹,那麼也可以有多叉樹,多叉樹就是每個節點有多個兒子,兒子之間的大小保證從左到右遞增,數據庫並不使用二叉樹做數據存儲,原因是索引不止存在內存中,還要寫到磁盤上. 二叉樹的數據存儲量是隨着樹高的增加而增加的,在數據爲100萬的時候我們的樹高就達到20了,這樣一次數據查詢就可能需要訪問20個數據塊,而在機械硬盤上,從磁盤隨機讀一個數據塊大概需要10ms,這樣的查詢效率是非常低的.**爲了讓一個查詢儘量少讀磁盤,就必須讓查詢過程訪問儘量少的數據塊.**那麼我們就不應該使用二叉樹,而是要使用"N叉樹".以InnoDB的一個整數字段索引爲例,這個N差不多是1200,當樹高是3的時候,就可以存1200的3次方個值,就是17億了.考慮到樹根的數據塊總是在內存中的,一個10億行的表上一個整數字段索引,查找一個值最多隻需要訪問3次磁盤,其實,樹的第二層也有很大概率在內存中,那麼訪問磁盤的平均次數就更少了.

`
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章