更新時間:2021-01-12 17:45:23 來源:動力節(jié)點 瀏覽1436次
分區(qū)表是將大表的數(shù)據(jù)分成稱為分區(qū)的許多小的子集,分區(qū)是將一個表的數(shù)據(jù)按照某種方式,比如按照時間上的月份,分成多個較小的,更容易管理的部分,但是邏輯上仍是一個表。由于在MySQL數(shù)據(jù)庫中,我們對MySQL分區(qū)表的理解十分晦澀,為了更好地理解MySQL分區(qū)表,本文我們來詳細(xì)講一講MySQL分區(qū)表原理。
如前所述,分區(qū)表由多個相關(guān)的底層表實現(xiàn),這些底層表也是由句柄對象(Handler object)標(biāo)識,所以可以直接訪問各個分區(qū)。分區(qū)有利于管理非常大的表,它采用分而治之的邏輯,分區(qū)引入了分區(qū)鍵的概念,分區(qū)鍵用于根據(jù)某個區(qū)間值(或者范圍值)、特定值列表或者h(yuǎn)ash函數(shù)值執(zhí)行數(shù)據(jù)的聚集,讓數(shù)據(jù)根據(jù)規(guī)則分布在不同的分區(qū)中,讓一個大對象變成一些小對象。
存儲引擎管理分區(qū)的各個底層表和管理普通表一樣(所有的底層表都必須使用相同的存儲引擎),分區(qū)表的索引只是在各個底層表上各自加上一個完全相同的索引
從存儲引擎的角度來看,底層表和一個普通表沒有任何不同,存儲引擎也無須直到這是一個普通表還是一個分區(qū)表的一部分。
我們先來看看MySQL分區(qū)表上的操作:
SELECT查詢:當(dāng)查詢一個分區(qū)表的時候,分區(qū)層先打開并鎖住所有的底層表,優(yōu)化器先判斷是否可以過濾部分分區(qū),然后再調(diào)用對應(yīng)的存儲引擎接口訪問各個分區(qū)的數(shù)據(jù)。
INSERT操作:當(dāng)寫入一條記錄時,分區(qū)層先打開并鎖住所有的底層表,然后確定哪個分區(qū)接收這條記錄,再將記錄寫入對應(yīng)底層表
DELETE操作:當(dāng)刪除一條記錄,分區(qū)層先打開并鎖住所有的底層表,然后確定數(shù)據(jù)對應(yīng)的分區(qū),最后對相應(yīng)底層表進(jìn)行刪除操作。
UPDATE操作:當(dāng)更新一條記錄時,分區(qū)層先打開并鎖住所有的底層表,MySQL先確定需要更新的記錄在哪個分區(qū),然后取出數(shù)據(jù)并更新,在判斷更新后的數(shù)據(jù)應(yīng)該放在哪個分區(qū),最后對底層表進(jìn)行寫入操作,并對原數(shù)據(jù)所在的底層表進(jìn)行刪除操作。
有些操作是支持過濾的。當(dāng)刪除一條記錄時,MySQL需要先找到這條記錄,如果WHERE條件恰好和分區(qū)表達(dá)式匹配,就可以將所有不包含這條記錄的分區(qū)都過濾掉。這對UPDATE語句同樣有效。如果是INSERT操作,則本身就是只命中一個分區(qū),其他分區(qū)都會被過濾掉。MySQL先確定這條操作屬于哪個分區(qū),再將記錄寫入對應(yīng)的底層分區(qū)表,無須對任何其他分區(qū)進(jìn)行操作。雖然每個操作都會”先打開并鎖住所有的底層表“,但這并不是說分區(qū)表在處理的過程中是鎖住全表的。如果存儲引擎能夠自己實現(xiàn)行級鎖,例如InnoDB,則會在分區(qū)層釋放對應(yīng)表鎖。這個加鎖和解鎖過程與普通InnoDB上的查詢類似。
MySQL分區(qū)表與單個磁盤或文件系統(tǒng)分區(qū)相比,可以存儲更多的數(shù)據(jù)。了解MySQL分區(qū)表原理便于我們理解MySQL分區(qū)表的使用,對于我們掌握MySQL分區(qū)表是十分必要的。想要學(xué)習(xí)更多的MySQL數(shù)據(jù)庫中的知識,快來本站的MySQL教程學(xué)習(xí)吧!
初級 202925
初級 203221
初級 202629
初級 203743