分割槽表是一種粗粒度,簡易的索引策略,適用於大資料的過濾場景.最適合的場景是,沒有合適的索引時,對其中幾個分割槽表進行全表掃瞄.或者只有乙個分割槽表和索引是熱點,而且這個分割槽和索引能夠全部儲存在記憶體中.限制單錶分割槽數不要超過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 5 6分割槽維護
mysql 5.6分割槽維護 表和分割槽的一些維護任務,適用於在mysql5.6的分割槽表上用sql語句進行。維護分割槽表,可以使用支援分割槽表的語句 check table,optimize table,analyze table,and repair table 你可以使用alter table...
mysql 5 6 分割槽 四 分割槽和鎖定
在mysql 5.6.5及更早版本中,對於 myisam執行dml或ddl語句時,實際執行表級鎖的 儲存引擎 影響分割槽表的這種語句對整個 施加了鎖定 也就是說,所有分割槽都被鎖定,直到語句完成。mysql 5.6.6實現 分割槽鎖定修剪 這在許多情況下消除了不必要的鎖定。在mysql 5.6.6及...
mysql分割槽表簡單例子
mysql分表可以有三種辦法實現 1.直接物理表實現分割槽 主要由程式控制 2.通過merge儲存引擎 3.通過分割槽字段進行分割槽 當然也可以通過上面3種方式進行自由組合 下面的例子說的是第三種 分割槽表 a 建立分割槽表 create table test log id bigint 20 no...