欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

數(shù)據(jù)庫(kù)分區(qū)是什么?

什么是分區(qū)?

數(shù)據(jù)庫(kù)分區(qū)一般指的是數(shù)據(jù)庫(kù)的表分區(qū),下面我們以MYSQL為例來(lái)講解數(shù)據(jù)庫(kù)分區(qū),其他數(shù)據(jù)庫(kù)道理基本相同。分區(qū)表對(duì)用戶來(lái)說(shuō)是一個(gè)邏輯整體,但底層mysql將其分離為多個(gè)物理子表,分區(qū)對(duì)于sql來(lái)說(shuō)是完全封裝的,也就是對(duì)我們應(yīng)用來(lái)說(shuō)是透明的,不可見(jiàn)的,但從底層的文件系統(tǒng)來(lái)看,一個(gè)表被分割為多個(gè)子表文件,使用方法也很簡(jiǎn)單,在創(chuàng)建表時(shí)使用partitionby子句定義分區(qū)表達(dá)式來(lái)存放數(shù)據(jù)。



mysql執(zhí)行查詢時(shí)候,優(yōu)化器先根據(jù)分區(qū)表達(dá)式的定義來(lái)過(guò)濾無(wú)用的分區(qū),執(zhí)行sql時(shí)只需要查找包含需要的數(shù)據(jù)分區(qū)就可以了。

分區(qū)的原理?

分區(qū)表管理一組分區(qū)表和管理普通表一樣,各個(gè)子表的索引也是上加了一個(gè)人完全相同的索引,從存儲(chǔ)引擎來(lái)看,子表和一個(gè)獨(dú)立的普通表沒(méi)有任何區(qū)別,以下我們來(lái)看看當(dāng)執(zhí)行以下命令的時(shí)候mysql如何操作分區(qū)表的:

  • select:查詢時(shí),分區(qū)層打開(kāi)并鎖住所有子表,優(yōu)化器先根據(jù)分區(qū)表達(dá)式過(guò)濾不需要的分區(qū),然后調(diào)用存儲(chǔ)引擎訪問(wèn)各個(gè)目標(biāo)分區(qū)。
  • insert:寫(xiě)入時(shí),分區(qū)層打開(kāi)并鎖住所有子表,根據(jù)分區(qū)表達(dá)式確認(rèn)存放數(shù)據(jù)的分區(qū)是哪一個(gè),再去指定分區(qū)插入記錄。
  • delete:刪除也是一樣,還是先鎖住所有分區(qū),根據(jù)分區(qū)表達(dá)式確認(rèn)數(shù)據(jù)在哪一個(gè)分區(qū),再去那個(gè)分區(qū)刪除記錄。
  • update:更新時(shí)相對(duì)復(fù)雜一點(diǎn),分區(qū)層打開(kāi)并鎖住所有子表,先根據(jù)分區(qū)表達(dá)式確認(rèn)數(shù)據(jù)在哪一個(gè)分區(qū),然后先取出數(shù)據(jù)并更新,再判斷更新后的數(shù)據(jù)應(yīng)該存放哪個(gè)分區(qū),最后對(duì)目標(biāo)分區(qū)寫(xiě)入數(shù)據(jù),最后一步要對(duì)原始數(shù)據(jù)的分區(qū)表進(jìn)行刪除操作。

分區(qū)類(lèi)型有哪些?

  • 范圍分區(qū):使用partitionbyrange(列的表達(dá)式)來(lái)表示,使用最多的分區(qū)表類(lèi)型,每個(gè)分區(qū)存儲(chǔ)某個(gè)范圍內(nèi)的數(shù)據(jù),比如:
  • 列表分區(qū):使用partitionbylist(列的表達(dá)式)按離散值集合分區(qū),這種分區(qū)類(lèi)型類(lèi)似于范圍分區(qū),例如:
  • 哈希分區(qū):使用partitionbyhash(列的表達(dá)式),按表達(dá)式的hashcode取模后分布到指定的區(qū)域,同理:

分區(qū)查詢優(yōu)化?

分區(qū)數(shù)據(jù)顯而易見(jiàn)的好處是數(shù)據(jù)分塊管理,大表拆小表,這樣在操作數(shù)據(jù)的時(shí)候可以預(yù)先過(guò)濾掉不必要的數(shù)據(jù),盡量控制在一個(gè)較小的數(shù)據(jù)區(qū)來(lái)查詢數(shù)據(jù)。一個(gè)很重要的意見(jiàn)是:盡量在where條件中帶入分區(qū)列查詢,如果沒(méi)有mysql就會(huì)掃描所有分區(qū),我們可以使用expainpatitions來(lái)查看sql語(yǔ)句是否使用了分區(qū)過(guò)濾,如:

explainpartitionsselect*fromtuser

結(jié)果顯示掃描的所有分區(qū),我們?cè)偌由蟱here條件:

explainpartitionsSELECT*fromtuserwherecid=2000

結(jié)果顯示只掃描了一個(gè)分區(qū)。

為什么要使用數(shù)據(jù)分區(qū)?

  • 表數(shù)據(jù)非常大后使用索引的代價(jià)過(guò)大、表數(shù)據(jù)呈現(xiàn)明顯的熱點(diǎn)數(shù)據(jù)。
  • 分區(qū)表的數(shù)據(jù)更容易維護(hù),可以單獨(dú)的針對(duì)子表進(jìn)行優(yōu)化和修復(fù)工作,也可以操作整個(gè)分區(qū)數(shù)據(jù)。
  • 分區(qū)子表的數(shù)據(jù)可以部署到不同的物理設(shè)備上,可以高效的利用多個(gè)硬件設(shè)備。
  • 由于一個(gè)大表數(shù)據(jù)分散到多個(gè)子表中,這樣可以避免單個(gè)索引的互斥和鎖的競(jìng)爭(zhēng)。

常見(jiàn)的問(wèn)題有哪些?

  • 一個(gè)表最多只能有1024個(gè)分區(qū)。
  • 分區(qū)過(guò)多可能會(huì)導(dǎo)致在進(jìn)行分區(qū)重組(重組會(huì)涉及到臨時(shí)數(shù)據(jù)表的復(fù)制和刪除)、表數(shù)據(jù)更新、分區(qū)查找的時(shí)候開(kāi)銷(xiāo)過(guò)大。
  • 執(zhí)行命令前mysql會(huì)鎖住所有分區(qū)表,這個(gè)操作是在過(guò)濾分區(qū)和執(zhí)行sql語(yǔ)句之前執(zhí)行的,所以這個(gè)開(kāi)銷(xiāo)無(wú)法避免,最好的做法是控制分區(qū)表數(shù)量在100個(gè)以內(nèi)。
  • 分區(qū)表達(dá)式的返回值必須是整數(shù)。
  • 分區(qū)表無(wú)法使用外鍵。
  • null值會(huì)使分區(qū)過(guò)濾無(wú)效。
  • mysql5.5以后對(duì)分區(qū)表做了大范圍的優(yōu)化和bug修復(fù),所以使用這個(gè)特性之前確保你mysql高于5.5版本。
  • 分區(qū)列和索引類(lèi)不匹配,如果我們?cè)谀承┝猩蟿?chuàng)建了索引,但這些列又不參與分區(qū),即partitionby類(lèi)型(列的表達(dá)式)子句不包含這些索引列,那么mysql在掃描這些索引的時(shí)候會(huì)遍歷所有分區(qū)表的索引,除非where子句使用了分區(qū)列來(lái)查詢,為了避免這個(gè)問(wèn)題盡量使用索引列來(lái)分區(qū),比如: