mysql分區表筆記
mysql分區表
mysql分區表是一個獨立的邏輯表,但是底層由多個物理字表組成。
對分區的請求,都會通過句柄對象轉化成對存儲引擎接口的調用。所以分區對于
對于sql層來說是一個完全封裝底層實現的黑盒子,對應用是透明的。
Mysql實現分區表的方式--對底層表的封裝--意味著索引也是按照分區的字表定義的,而沒有全局索引。
適合場景:
表中只有最后部分數據是熱點數據,其他均為臨時數據。
分區表中數據更容易維護,可以對獨立的分區進行優化,檢查、修復等操作
分區表數據可以分布在不同物理設備上,從而高效地利用多個硬件設備
可以備份和恢復獨立的分區,這在非常大的數據集的場景下效果非常好。
分區限制:
一個分區表只能有1024個分區
如果分區字段中有主鍵或者唯一索引的列,那么所有主鍵列和唯一索引列都必須包含進來。
利用分區表來避免某些特殊的瓶頸,例如Innodb的單個索引的互斥訪問ext3文件系統的inode鎖競爭等。
分區表無法使用外鍵約束。
分區表的原理
從存儲引擎的角度來看,底層表和一個普通的表沒有任何不同,存儲引擎也無需知道這是一個普通表還是一個分區表的一部分。
select查詢
分區表的類型
mysql支持多種分區表。分區表達式可以是列,也可以是包含列的表達式。例如,下表就可以將每一年的銷售額存放在不同的分區里。
create table sales(
order_date datetime not null,
--Other columns
)engine=InnoDB partition by range(Year(order_date))(
partition p_2010 values less then (2010),
partition p_2011 values less then(2011),
partition p_catchall values less then maxvalue);
mysql還支持鍵值,哈希和列表分區。
系統通過子分區可降低索引的互斥訪問的競爭。最近一年的分區的數據會被非常頻繁地訪問,這會導致大量的互斥鎖的競爭。使用哈希子分區可以
將數據切成多個小片,大大降低互斥量的競爭問題。