色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

數據庫分區是什么

錢瀠龍2年前39瀏覽0評論

數據庫分區是什么?

什么是分區?

數據庫分區一般指的是數據庫的表分區,下面我們以MYSQL為例來講解數據庫分區,其他數據庫道理基本相同。分區表對用戶來說是一個邏輯整體,但底層mysql將其分離為多個物理子表,分區對于sql來說是完全封裝的,也就是對我們應用來說是透明的,不可見的,但從底層的文件系統來看,一個表被分割為多個子表文件,使用方法也很簡單,在創建表時使用 partition by 子句定義分區表達式來存放數據。

mysql執行查詢時候,優化器先根據分區表達式的定義來過濾無用的分區,執行sql時只需要查找包含需要的數據分區就可以了。

分區的原理?

分區表管理一組分區表和管理普通表一樣,各個子表的索引也是上加了一個人完全相同的索引,從存儲引擎來看,子表和一個獨立的普通表沒有任何區別,以下我們來看看當執行以下命令的時候mysql如何操作分區表的:

select :查詢時,分區層打開并鎖住所有子表,優化器先根據分區表達式過濾不需要的分區,然后調用存儲引擎訪問各個目標分區。insert:寫入時,分區層打開并鎖住所有子表,根據分區表達式確認存放數據的分區是哪一個,再去指定分區插入記錄。delete:刪除也是一樣,還是先鎖住所有分區,根據分區表達式確認數據在哪一個分區,再去那個分區刪除記錄。update:更新時相對復雜一點,分區層打開并鎖住所有子表,先根據分區表達式確認數據在哪一個分區,然后先取出數據并更新,再判斷更新后的數據應該存放哪個分區,最后對目標分區寫入數據,最后一步要對原始數據的分區表進行刪除操作。分區類型有哪些?范圍分區:使用partition by range(列的表達式)來表示,使用最多的分區表類型,每個分區存儲某個范圍內的數據,比如:列表分區:使用 partition by list(列的表達式) 按離散值集合分區,這種分區類型類似于范圍分區,例如:哈希分區:使用 partition by hash(列的表達式),按表達式的hashcode取模后分布到指定的區域,同理:分區查詢優化?

分區數據顯而易見的好處是數據分塊管理,大表拆小表,這樣在操作數據的時候可以預先過濾掉不必要的數據,盡量控制在一個較小的數據區來查詢數據。一個很重要的意見是:盡量在where條件中帶入分區列查詢,如果沒有mysql就會掃描所有分區,我們可以使用expain patitions 來查看sql語句是否使用了分區過濾,如:

explain partitions select * from tuser

結果顯示掃描的所有分區,我們再加上where條件:

explain partitions SELECT * from tuser where cid=2000

結果顯示只掃描了一個分區。

為什么要使用數據分區?表數據非常大后使用索引的代價過大、表數據呈現明顯的熱點數據。分區表的數據更容易維護,可以單獨的針對子表進行優化和修復工作,也可以操作整個分區數據。分區子表的數據可以部署到不同的物理設備上,可以高效的利用多個硬件設備。由于一個大表數據分散到多個子表中,這樣可以避免單個索引的互斥和鎖的競爭。常見的問題有哪些?一個表最多只能有1024個分區。分區過多可能會導致在進行分區重組(重組會涉及到臨時數據表的復制和刪除)、表數據更新、分區查找的時候開銷過大。執行命令前mysql會鎖住所有分區表,這個操作是在過濾分區和執行sql語句之前執行的,所以這個開銷無法避免,最好的做法是控制分區表數量在100個以內。分區表達式的返回值必須是整數。分區表無法使用外鍵。null值會使分區過濾無效。mysql5.5以后對分區表做了大范圍的優化和bug修復,所以使用這個特性之前確保你mysql高于5.5版本。分區列和索引類不匹配,如果我們在某些列上創建了索引,但這些列又不參與分區,即 partition by 類型(列的表達式)子句不包含這些索引列,那么mysql在掃描這些索引的時候會遍歷所有分區表的索引,除非where子句使用了分區列來查詢,為了避免這個問題盡量使用索引列來分區,比如: