千萬級數據表如何用索引快速查找


1.首先介紹一下樹三棵樹

  1)二叉排序樹

  找個例子來說,輸入:

4    3    7    5    6    10    9

  

   產生這樣的搜索結構的話,當我們查找9,只用查找4次

  會出現極端狀態:如按序輸入1-8

  

  可見,使用二叉樹當索引結構並不合適,I/O次數太多

  2)B樹(又叫B-樹)

  當我們想減少I/O次數,那就得減少樹的高度,但是數據量恆定的情況下,高度減少意味着寬度得增加,從而引入B樹的概念

  

 

   以這個B樹來看,節點可以容納多個元素,高度為3,也就是最多I/O三次,從而找到想要的數據

  3)B+樹(MySql數據庫索引使用的是B+樹)

  B+樹是B樹的一個變形,且數據都保存在葉子節點,其余節點僅保存地址

  

  這是數據庫索引使用的結構

  以Mysql來說,一個節點默認可以存 16384b

  而節點里面一個元素的大小為:14b=8b索引(如0016)+6b地址(箭頭)

  也就是說,一個地址節點可以存:16384/14=1170個元素

  當數的高度為4,就能支持百萬、千萬的數據量

2.Mysql存儲引擎

  存儲引擎是指定到表的

  1)MyISAM:使用非聚集索引,索引文件和數據文件是分離的

    

  2)InnoDB:使用聚集索引,索引文件和數據文件放在一起

    

  總結:

  InnoDB在葉子節點就可以直接取到數據,

  MyISAM在葉子節點取到數據的地址,然后還要進行一個I/O操作,才能取到數據

  因此,InnoDB的執行效率會高一點

3.常見面試題

  1)為什么InnoDB表必須要有主鍵,我沒設置主鍵也能新增成功呀?

  InnoDB表需要組建B+樹,當沒有指定唯一索引的時候,會從左到右依次找,找到一列滿足唯一索引條件的,用這一列來組建B+樹;當沒有符合條件的列的時候,會自己生成一個隱藏列,用來構建B+樹;因此,InnoDB表最好自己指定主鍵。

  2)為什么InnoDB表主鍵推薦使用int自增主鍵?

  int類型容易比較大小。

  舉個反例:如果使用UUID當主鍵,那很難去比較大小,構造B+樹很困難,而且會占用更多的空間

  自增是為了讓葉子節點從左到右依次遞增,這樣可以避免已經存滿的葉子節點去列分,從而產生性能和空間的消耗。

  3)為什么基本不用hash索引?

  Mysql索引分為【B+樹索引】和【hash索引】

  B+樹索引上面介紹了,這里聊聊hash索引,hash索引是把索引列經過hash算法進行關聯,這里把col1當初索引列吧

select * from table where col1=1

  hash是通過hash算法快速定位數據的,這里會把col1=1通過hash算法進行定位,所以時間復雜度是O(1),效率非常高。

  那么問題來了,為什么效率這么高卻沒人使用,主要是:

select * from table where col1>1

  出現這種范圍查找,hash就跪了

  還有hash不能避免全表掃描,數據量大檢索效率低等問題

  4)B+樹是怎么實現范圍查找的

  B+樹的葉子節點是從左到右依次遞增的,而且各節點之間存在雙向指針,可以很好的支持范圍查找

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM