色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

數據庫分區是什么?

錢斌斌2年前15瀏覽0評論

什么是分區?

數據庫分區一般指的是數據庫的表分區,下面我們以MYSQL為例來講解數據庫分區,其他數據庫道理基本相同。分區表對用戶來說是一個邏輯整體,但底層mysql將其分離為多個物理子表,分區對于sql來說是完全封裝的,也就是對我們應用來說是透明的,不可見的,但從底層的文件系統來看,一個表被分割為多個子表文件,使用方法也很簡單,在創建表時使用partitionby子句定義分區表達式來存放數據。



mysql執行查詢時候,優化器先根據分區表達式的定義來過濾無用的分區,執行sql時只需要查找包含需要的數據分區就可以了。

分區的原理?

分區表管理一組分區表和管理普通表一樣,各個子表的索引也是上加了一個人完全相同的索引,從存儲引擎來看,子表和一個獨立的普通表沒有任何區別,以下我們來看看當執行以下命令的時候mysql如何操作分區表的:

  • select:查詢時,分區層打開并鎖住所有子表,優化器先根據分區表達式過濾不需要的分區,然后調用存儲引擎訪問各個目標分區。
  • insert:寫入時,分區層打開并鎖住所有子表,根據分區表達式確認存放數據的分區是哪一個,再去指定分區插入記錄。
  • delete:刪除也是一樣,還是先鎖住所有分區,根據分區表達式確認數據在哪一個分區,再去那個分區刪除記錄。
  • update:更新時相對復雜一點,分區層打開并鎖住所有子表,先根據分區表達式確認數據在哪一個分區,然后先取出數據并更新,再判斷更新后的數據應該存放哪個分區,最后對目標分區寫入數據,最后一步要對原始數據的分區表進行刪除操作。

分區類型有哪些?

  • 范圍分區:使用partitionbyrange(列的表達式)來表示,使用最多的分區表類型,每個分區存儲某個范圍內的數據,比如:
  • 列表分區:使用partitionbylist(列的表達式)按離散值集合分區,這種分區類型類似于范圍分區,例如:
  • 哈希分區:使用partitionbyhash(列的表達式),按表達式的hashcode取模后分布到指定的區域,同理:

分區查詢優化?

分區數據顯而易見的好處是數據分塊管理,大表拆小表,這樣在操作數據的時候可以預先過濾掉不必要的數據,盡量控制在一個較小的數據區來查詢數據。一個很重要的意見是:盡量在where條件中帶入分區列查詢,如果沒有mysql就會掃描所有分區,我們可以使用expainpatitions來查看sql語句是否使用了分區過濾,如:

explainpartitionsselect*fromtuser

結果顯示掃描的所有分區,我們再加上where條件:

explainpartitionsSELECT*fromtuserwherecid=2000

結果顯示只掃描了一個分區。

為什么要使用數據分區?

  • 表數據非常大后使用索引的代價過大、表數據呈現明顯的熱點數據。
  • 分區表的數據更容易維護,可以單獨的針對子表進行優化和修復工作,也可以操作整個分區數據。
  • 分區子表的數據可以部署到不同的物理設備上,可以高效的利用多個硬件設備。
  • 由于一個大表數據分散到多個子表中,這樣可以避免單個索引的互斥和鎖的競爭。

常見的問題有哪些?

  • 一個表最多只能有1024個分區。
  • 分區過多可能會導致在進行分區重組(重組會涉及到臨時數據表的復制和刪除)、表數據更新、分區查找的時候開銷過大。
  • 執行命令前mysql會鎖住所有分區表,這個操作是在過濾分區和執行sql語句之前執行的,所以這個開銷無法避免,最好的做法是控制分區表數量在100個以內。
  • 分區表達式的返回值必須是整數。
  • 分區表無法使用外鍵。
  • null值會使分區過濾無效。
  • mysql5.5以后對分區表做了大范圍的優化和bug修復,所以使用這個特性之前確保你mysql高于5.5版本。
  • 分區列和索引類不匹配,如果我們在某些列上創建了索引,但這些列又不參與分區,即partitionby類型(列的表達式)子句不包含這些索引列,那么mysql在掃描這些索引的時候會遍歷所有分區表的索引,除非where子句使用了分區列來查詢,為了避免這個問題盡量使用索引列來分區,比如: