中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL分區表的分區原理及優缺點

發布時間:2021-09-18 12:51:15 來源:億速云 閱讀:230 作者:chen 欄目:MySQL數據庫

這篇文章主要介紹“MySQL分區表的分區原理及優缺點”,在日常操作中,相信很多人在MySQL分區表的分區原理及優缺點問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”MySQL分區表的分區原理及優缺點”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1.分區表的原理

分區表是由多個相關的底層表實現,這些底層表也是由句柄對象表示,所以我們也可以直接訪問各個分區,存儲引擎管理分區的各個底層表和管理普通表一樣(所有的底層表都必須使用相同的存儲引擎),分區表的索引只是在各個底層表上各自加上一個相同的索引,從存儲引擎的角度來看,底層表和一個普通表沒有任何不同,存儲引擎也無須知道這是一個普通表還是一個分區表的一部分。

在分區表上的操作按照下面的操作邏輯進行:


select查詢:


當查詢一個分區表的時候,分區層先打開并鎖住所有的底層表,優化器判斷是否可以過濾部分分區,然后再調用對應的存儲引擎接口訪問各個分區的數據


insert操作:


當寫入一條記錄時,分區層打開并鎖住所有的底層表,然后確定哪個分區接受這條記錄,再將記錄寫入對應的底層表


delete操作:


當刪除一條記錄時,分區層先打開并鎖住所有的底層表,然后確定數據對應的分區,最后對相應底層表進行刪除操作


update操作:


當更新一條數據時,分區層先打開并鎖住所有的底層表,mysql先確定需要更新的記錄在哪個分區,然后取出數據并更新,再判斷更新后的數據應該放在哪個分區,然后對底層表進行寫入操作,并對原數據所在的底層表進行刪除操作


雖然每個操作都會打開并鎖住所有的底層表,但這并不是說分區表在處理過程中是鎖住全表的,如果存儲引擎能夠自己實現行級鎖,如:innodb,則會在分區層釋放對應的表鎖,這個加鎖和解鎖過程與普通Innodb上的查詢類似。


2.在下面的場景中,分區可以起到非常大的作用:


A:表非常大以至于無法全部都放在內存中,或者只在表的最后部分有熱點數據,其他都是歷史數據


B:分區表的數據更容易維護,如:想批量刪除大量數據可以使用清除整個分區的方式。另外,還可以對一個獨立分區進行優化、檢查、修復等操作


C:分區表的數據可以分布在不同的物理設備上,從而高效地利用多個硬件設備


D:可以使用分區表來避免某些特殊的瓶頸,如:innodb的單個索引的互斥訪問,ext3文件系統的inode鎖競爭等


E:如果需要,還可以備份和恢復獨立的分區,這在非常大的數據集的場景下效果非常好


F:優化查詢,在where字句中包含分區列時,可以只使用必要的分區來提高查詢效率,同時在涉及sum()和count()這類聚合函數的查詢時,可以在每個分區上面并行處理,最終只需要匯總所有分區得到的結果。


3.分區本身也有一些限制:


A:一個表最多只能有1024個分區(mysql5.6之后支持8192個分區)


B:在mysql5.1中分區表達式必須是整數,或者是返回整數的表達式,在5.5之后,某些場景可以直接使用字符串列和日期類型列來進行分區(使用varchar字符串類型列時,一般還是字符串的日期作為分區)。


C:如果分區字段中有主鍵或者唯一索引列,那么所有主鍵列和唯一索引列都必須包含進來,如果表中有主鍵或唯一索引,那么分區鍵必須是主鍵或唯一索引


D:分區表中無法使用外鍵約束

E:mysql數據庫支持的分區類型為水平分區,并不支持垂直分區,因此,mysql數據庫的分區中索引是局部分區索引,一個分區中既存放了數據又存放了索引,而全局分區是指的數據庫放在各個分區中,但是所有的數據的索引放在另外一個對象中


F:目前mysql不支持空間類型和臨時表類型進行分區。不支持全文索引


4.子分區的建立需要注意以下幾個問題:


A:每個子分區的數量必須相同


B:只要在一個分區表的任何分區上使用subpartition來明確定義任何子分區,就必須在所有分區上定義子分區,不能漏掉一些分區不進行子分區。


C:每個subpartition子句必須包括子分區的一個名字


D:子分區的名字必須是唯一的,不能在一張表中出現重名的子分區


E:mysql數據庫的分區總是把null當作比任何非null更小的值,這和數據庫中處理null值的order by操作是一樣的,升序排序時null總是在最前面,因此對于不同的分區類型,mysql數據庫對于null的處理也各不相同。對于range分區,如果向分區列插入了null,則mysql數據庫會將該值放入最左邊的分區,注意,如果刪除分區,分區下的所有內容都從磁盤中刪掉了,null所在分區被刪除,null值也就跟著被刪除了。在list分區下要使用null,則必須顯式地定義在分區的散列值中,否則插入null時會報錯。hash和key分區對于null的處理方式和range,list分區不一樣,任何分區函數都會將null返回為0.

到此,關于“MySQL分區表的分區原理及優缺點”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文山县| 宜都市| 永丰县| 游戏| 福泉市| 盐源县| 太康县| 苍山县| 江都市| 洛隆县| 乳山市| 潼关县| 土默特左旗| 江油市| 昌图县| 博白县| 黔东| 伊金霍洛旗| 德格县| 新竹市| 长丰县| 临安市| 达孜县| 康平县| 旅游| 改则县| 聂荣县| 雷波县| 东源县| 肇源县| 通榆县| 象山县| 尼玛县| 秭归县| 山西省| 山阳县| 辽阳县| 钟山县| 景东| 海阳市| 元阳县|