堆表與索引組織表

Ⅰ、堆表

數據存放在數據裏面,索引存放在索引裏
oracle

  • 堆就是無序數據的集合,索引就是將數據變得有序,在索引中鍵值有序,數據仍是無序的
  • 堆表中,主鍵索引和普通索引同樣的,葉子節點存放的是指向堆表中數據的指針(能夠是一個頁編號加偏移量),指向物理地址,沒有回表的說法
  • 堆表中,主鍵和普通索引基本上沒區別,和非空的惟一索引沒區別

myisam就是用的這個堆表的存儲方式,oracle支持堆表,pg只支持堆表性能

Ⅱ、索引組織表

咱們如今都玩innodb,因此堆表一帶而過,重點關注索引組織表
指針

  • 對於主鍵的索引,頁子節點存放了一整行全部數據,其餘索引稱爲輔助索引(二級索引),它的頁子節點只是存放了鍵值和主鍵值
  • 主鍵包含了一張表的全部數據,由於主鍵索引的頁子節點中保存了每一行的完整記錄,包括全部列。若是沒有主鍵,MySQL會自動幫你加一個主鍵,可是對用戶不可見
  • innodb中數據存放在彙集索引中,換言之,按照主鍵的方式來組織數據的
  • 其餘索引(惟一索引,普通索引)的頁子節點存放該索引列的鍵值和主鍵值
  • 無論是什麼索引非頁子節點存放的存放的就是鍵值和指針,不存數據,這個指針在innodb中是6個bit,鍵值就看數據大小了

Ⅲ、兩個重點問題

3.一、一個表A,主鍵值8個字節,每條記錄300個字節,每一個page16k,求這張表B+ tree高度爲1 能存放多少記錄,2呢? 3?
首先,一個頁能存放16k/300個記錄code

  • h爲1,即root page 就是 leaf節點,就是大約五十條記錄
  • h爲2,每一個頁仍是不變的大約50條記錄,就看頁的上層扇出一共最多能有多少指針,非頁子節點存放的就是指針和主鍵值,因此16k/(8+6) 差很少是1000,因此是50*1000條記錄
  • h爲3,上面有兩層非頁節點,因此50 * 1000 * 1000

也就是說5000w的記錄中找一個主鍵,只要找三個頁,一億和五百億都是找四次,因此表變大,查詢速度不會有變化,最差的hdd盤,一秒鐘能查100次,實際生產中,B+ tree 高度4層差很少了,5層不多,高度越低性能越好blog

DML操做,先找到頁,把這個頁讀到內存中,而後再去操做,只要你內存夠大,頁全放內存中,快的很索引

B+ tree的好處:查某個範圍內,或者某幾條數據,或者根據主鍵來查,很快,可是要把幾千萬數據查一下還要join那確定慢了,固然也能夠作定型、作hash join內存

缺點:插入比較慢hash

3.二、爲何主鍵查詢比二級索引查詢來的快
主鍵索引裏面包含了每一行完整的數據,只要找到那個主鍵就是找到那個記錄,二級索引,若是查詢的列不是索引列,走那個列的索引找到後還要去根據索引裏保存的主鍵去找查詢列的內容,這裏多了一步,這種查找叫書籤查找或者回表,若是一個高度爲3的樹,原本查只要查三個頁,走二級索引就要查六個頁it

a b c 三個列,a是主鍵,b是普通索引innodb

select c from tb;
若是走b列的普通索引,會先找到對應的a,再經過a找到對應的c
①select c where b=?
②select c where a = ?
相關文章
相關標籤/搜索