java mysql 分区表_mysql分区表
對用戶來說,分區(qū)表是一個(gè)獨(dú)立的邏輯表,但是底層由多個(gè)物理子表組成。實(shí)現(xiàn)分區(qū)的代碼實(shí)際上是對一組底層表的句柄對象的封裝。
mysql在創(chuàng)建表時(shí)使用PARTITION BY子句定義每個(gè)分區(qū)存放的數(shù)據(jù)。在執(zhí)行查詢的時(shí)候,優(yōu)化器會根據(jù)分區(qū)定義過濾那些沒有我們需要數(shù)據(jù)的分區(qū),這樣查詢就無須掃描所有分區(qū)——只需要查詢包含需要數(shù)據(jù)的分區(qū)就可以了。
分區(qū)的一個(gè)主要目的是將數(shù)據(jù)按照一個(gè)較粗的粒度分在不同的表中,這樣做可以將相關(guān)的數(shù)據(jù)放在一起,另外,如果想一次批量刪除整個(gè)分區(qū)的數(shù)據(jù)也會變得很方便。
在下面的場景中,分區(qū)可以起到非常大的作用:
1.表非常大以至于無法全部都放在內(nèi)存中,或者只在表的最后部分有熱點(diǎn)數(shù)據(jù),其他均是歷史數(shù)據(jù)。
2.分區(qū)表的數(shù)據(jù)更容易維護(hù)。例如想批量刪除大量數(shù)據(jù)可以使用清除整個(gè)分區(qū)的方式。另外,還可以對一個(gè)獨(dú)立分區(qū)進(jìn)行優(yōu)化、檢查、修復(fù)等操作。
3.分區(qū)表的數(shù)據(jù)可以分布在不同的物理設(shè)備上,從而高效地利用多個(gè)硬件設(shè)備。
4.可以使用分區(qū)表來避免某些特殊的瓶頸,例如InnoDB的單個(gè)索引的互斥訪問,ext3文件系統(tǒng)的inode鎖競爭等。
5.如果需要,還可以備份和恢復(fù)獨(dú)立的分區(qū),這在非常大的數(shù)據(jù)集的場景下效果非常好。
分區(qū)表本身也有一些限制,下面是其中比較重要的幾點(diǎn):
1.一個(gè)表最多只能有1024個(gè)分區(qū)。
2.在mysql5.1中,分區(qū)表達(dá)式必須是整數(shù),或者是返回整數(shù)的表達(dá)式。在mysql5.5中,某些場景中可以直接使用列進(jìn)行分區(qū)。
3.如果分區(qū)字段中有主鍵或者唯一索引的列,那么所有主鍵列和唯一索引列都必須包含進(jìn)來。
4.分區(qū)表中無法使用外鍵約束。
分區(qū)表上的操作按照下面的操作邏輯進(jìn)行:
select查詢
當(dāng)查詢一個(gè)分區(qū)表的時(shí)候,分區(qū)層先打開并鎖住所有的底層表,優(yōu)化器先判斷是否可以過濾部分分區(qū),然后再調(diào)用對應(yīng)的存儲引擎接口訪問各個(gè)分區(qū)的數(shù)據(jù)。
insert操作
當(dāng)寫入一條記錄時(shí),分區(qū)層先打開并鎖住所有的底層表,然后確定哪個(gè)分區(qū)接收這條記錄,再將記錄寫入對應(yīng)底層表。
delete操作
當(dāng)刪除一條記錄時(shí),分區(qū)層先打開并鎖住所有的底層表,然后確定數(shù)據(jù)對應(yīng)的分區(qū),最后對相應(yīng)底層表進(jìn)行刪除操作。
update操作
當(dāng)更新一條記錄時(shí),分區(qū)層先打開并鎖住所有的底層表,mysql先確定需要更新的記錄在哪個(gè)分區(qū),然后取出數(shù)據(jù)并更新,再判斷更新后的數(shù)據(jù)在哪個(gè)分區(qū),最后對底層進(jìn)行寫入操作,并對原數(shù)據(jù)所在的底層表進(jìn)行刪除操作。
雖然每個(gè)操作都有“先打開并鎖住所有的底層表”,但這并不是說分區(qū)表在處理過程中是鎖住全表的。如果存儲引擎能夠自己實(shí)現(xiàn)行級鎖,例如innoDb,則會在分區(qū)層釋放對應(yīng)表鎖。這個(gè)加鎖和解鎖過程與普通InnoDB上的查詢類似。
總結(jié)
以上是生活随笔為你收集整理的java mysql 分区表_mysql分区表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vue - 加载静态图片的方式
- 下一篇: mysql 小于转义_MyBatis中大