MySQL分區表與索引

一、定義

簡而言之就是將一張邏輯上仍然完整的表,在物理存儲的過程中,將表上的數據按某種指定的劃分依據,在物理上存放到多個“表空間”(物理文件上),這樣查詢數據時,不至於每次都掃描整張表而只是從當前的分區查到所要的數據,這樣大大提高了數據查詢的速度。
優點:

  • 改善查詢性能:對分區對象的查詢可以僅搜索自己關心的分區,提高檢索速度;
  • 增強可用性:如果表的某個分區出現故障,表在其他分區的數據仍然可用;
  • 維護方便:如果表的某個分區出現故障,需要修復數據,只修復該分區即可;
  • 均衡I/O:可以把不同的分區映射到不同磁盤以平衡I/O,改善整個系統性能。

缺點:

  • 已經存在的表沒有方法可以直接轉化爲分區表,總之,利大於弊
  • 一個表最多只能有1024個分區
  • 分區表中無法使用外鍵約束
  • 各個底層表必須使用相同的存儲引擎

二、分區表的原理

其實對存儲引擎來說,底層表和普通表來說是沒有什麼區別的,這就像對CPU而言其實本質上所有的物理內存都是擁有同等地位的,只不過由於人爲的設定纔有了內核態與用戶態一樣,那麼存儲引擎會爲每一個底層表都設置相同的索引,這樣就可以實現快速定位與簡單的優化過濾了。

  • 對於select,分區層會先打開並鎖住所有底層表(對InnoDB來說可以只使用行鎖),然後優化器會先判斷過濾部分分區,然會調用存儲引擎的接口開始訪問數據
  • 對於insert,分區層會先打開並鎖住所有底層表,然後確定對應分區將數據寫入對應底層表
  • 對於delete,分區層會先打開並鎖住所有底層表,然後確定對應分區將數據從對應底層表刪除
  • 對於update,分區層會先打開並鎖住所有底層表,然後確定對應分區將數據從對應底層表拿出,更新數據之後再來判斷要插入那個分區,最後對底層表進行寫入操作,然後將原數據從對應底層表刪除

三、分區表的類型

通常是根據某一列的數據範圍進行劃分。
創建分區表要在使用create table命令時配合partition子句進行劃分,需要注意的是partition子句使用的表達式的返回值要是一個確定的整數,且不能是一個常數。如假如使用日期進行分區我們就要使用year()或to_days()來進行處理得到一個具體的整數。

四、分區表的使用策略

  • 全量掃描數據,不爲分區表建立索引
  • 索引數據,並分離熱點
    第一點好理解,第二點其實就是指將會經常訪問的數據分離出來,又可能的話就把這部分數據緩存到內存裏面,這樣查詢的時候就可以只訪問很小的一部分分區表了。需要注意的是這兩點都是基於查詢可以進行過濾而且分區不會造成額外代價這兩點假設而言的,自然就會存在一些問題,進而導致遇到下面幾個問題:
  • NULL值使得分區過濾無效
  • 分區列和索引列不匹配
  • 尋找查詢對象時正確選擇分區可能開銷很大
  • 打開並鎖住所有底層表的差別可能很高
  • 維護分區的成本可能很高

五、索引

1.建立索引的三種數據結構
  • 哈希索引
    對於key值相同的索引,哈希索引默認採用拉鍊法解決hash衝突。缺點是對於區間查詢比較慢,需要逐項查找,所以這種索引結構只適合於等值查詢的場景。
  • 有序數組索引
    此索引可以解決上面等值查詢的問題,但是它不適合進行插入和刪除操作,所以這對於數據庫來說是不可忍受的,故它只能作用於靜態存儲引擎,負責索引不會發生變化的數據。
  • 多路搜索樹
    爲什麼不使用二叉搜索樹?
    因爲索引也是文件,我們要把他放在磁盤上,對於二叉樹我們都知道查找效率大約爲O(logN),,其實就是樹高,在使用機械硬盤進行數據讀寫時,一次IO可能就需要10ms,若樹高爲20,那可能查找到一個索引就需要200ms,這是不可接受的,但多路搜索樹就不一樣了,InnoDB使用的是1200叉樹,只需要四層高的樹就可以訪問12003(約17億)個值了,這樣磁盤IO時間會極少。
2.InnoDB的索引模型

使用B+樹索引模型,根據主鍵或者非主鍵建立的索引其查找複雜度不同。使用主鍵建立的索引我們叫做聚簇索引,使用非主鍵建立的索引叫做二次索引。之所以說二次索引不推薦使用就是因爲其會先找到主鍵,然後依據主鍵索引繼續查找,平白做了一點兒無用事。

3.覆蓋索引

在使用非主鍵索引k查詢結果時,若發現查詢結果已經在K索引樹上了的話就不需要去主鍵索引樹上去查找了,即這個普通索引k索引樹覆蓋了我們的查詢需求,所以稱之爲覆蓋索引。
使用覆蓋索引減少了樹的搜索次數,顯著提升了查詢性能,所以使用覆蓋索引是一個常用的性能優化手段。

4.InnoDB索引和MyISAM索引的區別
  • 一是主索引的區別,InnoDB的數據文件本身就是索引文件。而MyISAM的索引和數據是分開的。
  • 二是輔助索引的區別:InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。而MyISAM的輔助索引和主索引沒有多大區別
5. InnoDB與MyISAM的區別
  • 使用索引結構的差別
  • 對事務的支持不同
  • 鎖的粒度不同
  • 對於全文檢索的支持不同
  • 效率不同,MyISAM的效率要高一點
  • MyISAM不支持外鍵,而 InnoDB是唯一支持外鍵的MySQL引擎
    關鍵字:索引,鎖粒度,事務,外鍵,效率

[推薦閱讀]:
mysql數據庫面試總結
常見面試題整理–數據庫篇(每位開發者必備)
如何理解關係型數據庫的常見設計範式?

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