對使用者來說,分割槽表是乙個獨立的邏輯表,但是底層由多個物理子表組成。實現分割槽的**實際上是對一組底層表的控制代碼物件的封裝。
mysql在建立表時使用partition by子句定義每個分割槽存放的資料。在執行查詢的時候,優化器會根據分割槽定義過濾那些沒有我們需要資料的分割槽,這樣查詢就無須掃瞄所有分割槽——只需要查詢包含需要資料的分割槽就可以了。
分割槽的乙個主要目的是將資料按照乙個較粗的粒度分在不同的表中,這樣做可以將相關的資料放在一起,另外,如果想一次批量刪除整個分割槽的資料也會變得很方便。
在下面的場景中,分割槽可以起到非常大的作用:
1.表非常大以至於無法全部都放在記憶體中,或者只在表的最後部分有熱點資料,其他均是歷史資料。
2.分割槽表的資料更容易維護。例如想批量刪除大量資料可以使用清除整個分割槽的方式。另外,還可以對乙個獨立分割槽進行優化、檢查、修復等操作。
3.分割槽表的資料可以分布在不同的物理裝置上,從而高效地利用多個硬體裝置。
4.可以使用分割槽表來避免某些特殊的瓶頸,例如innodb的單個索引的互斥訪問,ext3檔案系統的inode鎖競爭等。
5.如果需要,還可以備份和恢復獨立的分割槽,這在非常大的資料集的場景下效果非常好。
分割槽表本身也有一些限制,下面是其中比較重要的幾點:
1.乙個表最多只能有1024個分割槽。
2.在mysql5.1中,分割槽表示式必須是整數,或者是返回整數的表示式。在mysql5.5中,某些場景中可以直接使用列進行分割槽。
3.如果分割槽欄位中有主鍵或者唯一索引的列,那麼所有主鍵列和唯一索引列都必須包含進來。
4.分割槽表中無法使用外來鍵約束。
分割槽表上的操作按照下面的操作邏輯進行:
select查詢
當查詢乙個分割槽表的時候,分割槽層先開啟並鎖住所有的底層表,優化器先判斷是否可以過濾部分分割槽,然後再呼叫對應的儲存引擎介面訪問各個分割槽的資料。
insert操作
當寫入一條記錄時,分割槽層先開啟並鎖住所有的底層表,然後確定哪個分割槽接收這條記錄,再將記錄寫入對應底層表。
delete操作
當刪除一條記錄時,分割槽層先開啟並鎖住所有的底層表,然後確定資料對應的分割槽,最後對相應底層表進行刪除操作。
update操作
當更新一條記錄時,分割槽層先開啟並鎖住所有的底層表,mysql先確定需要更新的記錄在哪個分割槽,然後取出資料並更新,再判斷更新後的資料在哪個分割槽,最後對底層進行寫入操作,並對原資料所在的底層表進行刪除操作。
雖然每個操作都有「先開啟並鎖住所有的底層表」,但這並不是說分割槽表在處理過程中是鎖住全表的。如果儲存引擎能夠自己實現行級鎖,例如innodb,則會在分割槽層釋放對應表鎖。這個加鎖和解鎖過程與普通innodb上的查詢類似。
MySQL分割槽表
分割槽表是一種粗粒度,簡易的索引策略,適用於大資料的過濾場景.最適合的場景是,沒有合適的索引時,對其中幾個分割槽表進行全表掃瞄.或者只有乙個分割槽表和索引是熱點,而且這個分割槽和索引能夠全部儲存在記憶體中.限制單錶分割槽數不要超過150個,並且注意某些導致無法做分割槽過濾的細節,分割槽表對於單條記錄...
mysql分割槽表 MySQL分割槽表的正確使用方法
mysql分割槽表概述 我們經常遇到一張表裡面儲存了上億甚至過十億的記錄,這些表裡面儲存了大量的歷史記錄。對於這些歷史資料的清理是乙個非常頭疼事情,由於所有的資料都乙個普通的表裡。所以只能是啟用乙個或多個帶where條件的delete語句去刪除 一般where條件是時間 這對資料庫的造成了很大壓力。...
MySQL分割槽表 hash分割槽
雜湊分割槽最主要的用法是用來保證資料的平均分布。使用範圍分割槽和列表分割槽時必須顯示地定義分割槽值或者值列表 但是使用雜湊分割槽時,我們只需要對列值或者基於列值的表示式進行雜湊運算,就可以進行分割槽了。在進行雜湊分割槽是,我們需要在create table語句後加上partition by hash...