MySQL分割槽表

2021-09-06 11:04:50 字數 2050 閱讀 7453

分割槽表是一種粗粒度,簡易的索引策略,適用於大資料的過濾場景.最適合的場景是,沒有合適的索引時,對其中幾個分割槽表進行全表掃瞄.或者只有乙個分割槽表和索引是熱點,而且這個分割槽和索引能夠全部儲存在記憶體中.限制單錶分割槽數不要超過150個,並且注意某些導致無法做分割槽過濾的細節,分割槽表對於單條記錄的查詢沒有優勢,需要注意這類查詢的效能.

分割槽表語法

分割槽表分為range,list,hash,key四種型別,並且分割槽表的索引是可以區域性針對分割槽表建立的

建立分割槽表

create table sales (

id int auto_increment,

amount double not null,

order_day datetime not null,

primary key(id, order_day)

) engine=innodb partition by range(year(order_day)) (

partition p_2010 values less than (2010),

partition p_2011 values less than (2011),

partition p_2012 values less than (2012),

partition p_catchall values less than maxvalue);

這段語句表示將表內資料按照order_dy的年份範圍進行分割槽,2023年乙個區,2011乙個,2012乙個,剩下的乙個.

要注意如果這麼做,則order_day必須包含在主鍵中,且會產生乙個問題,就是當年份超過閾值,到了2013,2014時,需要手動建立這些分割槽

替代方法就是使用hash

create table sales (

id int primary key auto_increment,

amount double not null,

order_day datetime not null

) engine=innodb partition by hash(id div 1000000);

這種分割槽表示每100w條資料建立乙個分割槽,且沒有閾值範圍的影響

對於大資料而言

對於大資料(如10tb)而言,索引起到的作用相對小,因為索引的空間與維護成本很高,另外如果不是索引覆蓋查詢,將導致回表,造成大量磁碟io.那麼對於這種情況的解決策略是:

1.全量掃瞄資料,不要任何索引

通過分割槽表表示式將資料定位在少量的分割槽表,然後正常訪問這些分割槽表的資料

2.分離熱點,索引資料

將熱點資料分離出來在乙個小的分割槽,並對分割槽建立索引,對熱點資料的查詢提高效率.

分割槽表的問題

1.null值使分割槽過濾無效

假設按照range year(order_date)分割槽,那麼如果這個表示式計算出來的時null值,記錄就會被存放到第乙個分割槽.所以在查詢時加入查詢條件有可能出現null值,那麼就會去檢查第乙個分割槽.解決的方法可以是將第乙個分割槽建立為null分割槽 partition p_nulls values less than (0),或者在mysql5.5以後,直接使用column建立分割槽 partition by range columns(order_date)

2. 選擇分割槽的成本

每插入一行資料都需要按照表示式篩選插入的分割槽位址

3. 分割槽列和索引列不匹配

如果索引列和分割槽列不匹配,且查詢中沒有包含過濾分割槽的條件,會導致無法進行分割槽過濾,那麼將會導致查詢所有分割槽.

4. 開啟並鎖住所有底層表

分割槽表的的查詢策略是在分割槽過濾之前,開啟並鎖住所有底層表,這會造成額外的開銷,解決問題的方法是盡量使用批量操作,例如load data infile,或者一次刪除多行資料.

過濾分割槽表的要點

過濾分割槽表的where條件必須是切分分割槽表的列,而不能帶有函式,例如只能是order_day,而不能是year(order_day)

mysql分割槽表

對使用者來說,分割槽表是乙個獨立的邏輯表,但是底層由多個物理子表組成。實現分割槽的 實際上是對一組底層表的控制代碼物件的封裝。mysql在建立表時使用partition by子句定義每個分割槽存放的資料。在執行查詢的時候,優化器會根據分割槽定義過濾那些沒有我們需要資料的分割槽,這樣查詢就無須掃瞄所有...

mysql分割槽表 MySQL分割槽表的正確使用方法

mysql分割槽表概述 我們經常遇到一張表裡面儲存了上億甚至過十億的記錄,這些表裡面儲存了大量的歷史記錄。對於這些歷史資料的清理是乙個非常頭疼事情,由於所有的資料都乙個普通的表裡。所以只能是啟用乙個或多個帶where條件的delete語句去刪除 一般where條件是時間 這對資料庫的造成了很大壓力。...

MySQL分割槽表 hash分割槽

雜湊分割槽最主要的用法是用來保證資料的平均分布。使用範圍分割槽和列表分割槽時必須顯示地定義分割槽值或者值列表 但是使用雜湊分割槽時,我們只需要對列值或者基於列值的表示式進行雜湊運算,就可以進行分割槽了。在進行雜湊分割槽是,我們需要在create table語句後加上partition by hash...