日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql分区、分表学习

發(fā)布時(shí)間:2024/2/28 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql分区、分表学习 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
現(xiàn)在學(xué)習(xí)mysql表分區(qū),百度了資料,特整理一下,原文章https://my.oschina.net/ydsaky...

分區(qū)

一、什么是表分區(qū)

通俗地講表分區(qū)是將一大表,根據(jù)條件分割成若干個(gè)小表。mysql5.1開(kāi)始支持?jǐn)?shù)據(jù)表分區(qū)了。
如:某用戶(hù)表的記錄超過(guò)了600萬(wàn)條,那么就可以根據(jù)入庫(kù)日期將表分區(qū),也可以根據(jù)所在地將表分區(qū)。當(dāng)然也可根據(jù)其他的條件分區(qū)。

使用表分區(qū)技術(shù)對(duì)客戶(hù)端沒(méi)有影響相當(dāng)于所有的數(shù)據(jù)還是存放在一張表中,但是相對(duì)于mysql內(nèi)部來(lái)講,卻是將數(shù)據(jù)拆分存放在不同位置中,就好比一個(gè)文件夾下文件過(guò)多需要整理存放在不同子文件夾中一樣。

二、為什么要對(duì)表進(jìn)行分區(qū)

為了改善大型表以及具有各種訪(fǎng)問(wèn)模式的表的可伸縮性,可管理性和提高數(shù)據(jù)庫(kù)效率。
分區(qū)的一些優(yōu)點(diǎn)包括:

  • 與單個(gè)磁盤(pán)或文件系統(tǒng)分區(qū)相比,可以存儲(chǔ)更多的數(shù)據(jù)。
  • 對(duì)于那些已經(jīng)失去保存意義的數(shù)據(jù),通常可以通過(guò)刪除與那些數(shù)據(jù)有關(guān)的分區(qū),很容易地刪除那些數(shù)據(jù)。
  • 一些查詢(xún)可以得到極大的優(yōu)化,這主要是借助于滿(mǎn)足一個(gè)給定WHERE語(yǔ)句的數(shù)據(jù)可以只保存在一個(gè)或多個(gè)分區(qū)內(nèi),這樣在查找時(shí)就不用查找其他剩余的分區(qū)。
  • 通過(guò)跨多個(gè)磁盤(pán)來(lái)分散數(shù)據(jù)查詢(xún),來(lái)獲得更大的查詢(xún)吞吐量。
  • 三、分區(qū)類(lèi)型

  • RANGE分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
  • LIST分區(qū):類(lèi)似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來(lái)進(jìn)行選擇。
  • HASH分區(qū):基于用戶(hù)定義的表達(dá)式的返回值來(lái)進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
  • KEY分區(qū):類(lèi)似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。
  • RANGE和LIST屬于條件算法,KEY和HASH屬于取余算法

    四、各分區(qū)詳細(xì)介紹

    1.range分區(qū)

    CREATE TABLE employees (id INT NOT NULLstore_id int ) partition BY RANGE (store_id) (partition p0 VALUES LESS THAN (6),partition p1 VALUES LESS THAN (11),partition p2 VALUES LESS THAN (16),partition p3 VALUES LESS THAN MAXVALUE );
    • 這樣p0-p5的店員會(huì)保存在p0,p6-p10的店員會(huì)保存在p1,以此類(lèi)推。MAXVALUE為常量表示最大的可能的整數(shù)值。
    • 這里最值得注意的限制是MySQL 必須能夠計(jì)算表達(dá)式的返回值作為L(zhǎng)ESS THAN (<)比較的一部分;因此,表達(dá)式的值不能為NULL。

    RANGE分區(qū)在如下場(chǎng)合特別有用:

  • 當(dāng)需要?jiǎng)h除一個(gè)分區(qū)上的“舊的”數(shù)據(jù)時(shí),只刪除分區(qū)即可。如果你使用上面最近的那個(gè)例子給出的分區(qū)方案,你只需簡(jiǎn)單地使用 “ALTER TABLE employees DROP PARTITION p0;”來(lái)刪除所有在店鋪0的雇員相對(duì)應(yīng)的所有行。對(duì)于有大量行的表,這比運(yùn)行一個(gè)如“DELETE FROM employees WHERE store_id <= 6;”這樣的一個(gè)DELETE查詢(xún)要有效得多。
  • 經(jīng)常運(yùn)行直接依賴(lài)于用于分割表的列的查詢(xún)。例如,當(dāng)執(zhí)行一個(gè)如“SELECT COUNT(*) FROM employees WHERE store_id<6 GROUP BY store_id;”這樣的查詢(xún)時(shí),MySQL可以很迅速地確定只有分區(qū)p0需要掃描,這是因?yàn)橛嘞碌姆謪^(qū)不可能包含有符合該WHERE子句的任何記錄。
  • 2.list分區(qū)

    假定有20個(gè)音像店,分布在4個(gè)有經(jīng)銷(xiāo)權(quán)的地區(qū),如下表所示:

    地區(qū) 商店編號(hào)
    東區(qū)1,2,3,4
    西區(qū)11,12
    南區(qū)5,6,7
    北區(qū)8,9,10

    要按照屬于同一個(gè)地區(qū)商店的行保存在同一個(gè)分區(qū)中的方式來(lái)分割表,可以使用下面的“CREATE TABLE”語(yǔ)句:

    CREATE TABLE employees (id INT NOT NULLstore_id int ) partition BY LIST(store_id)(partition pNorth VALUES IN (8,9,10),partition pEast VALUES IN (1,2,3,4),partition pWest VALUES IN (5,6,7),partition pSouth VALUES IN (11,12) );

    這使得在表中增加或刪除指定地區(qū)的雇員記錄變得容易起來(lái)。例如,假定西區(qū)的所有音像店都賣(mài)給了其他公司。那么與在西區(qū)音像店工作雇員相關(guān)的所有記錄(行)可以使用查詢(xún)“ALTER TABLE employees DROP PARTITION pWest;”來(lái)進(jìn)行刪除,它與具有同樣作用的DELETE (刪除)查詢(xún)“DELETE query DELETE FROM employees WHERE store_id IN (4,12,13,14,18);”比起來(lái),要有效得多。

    【要點(diǎn)】:如果試圖插入列值(或分區(qū)表達(dá)式的返回值)不在分區(qū)值列表中的一行時(shí),那么“INSERT”查詢(xún)將失敗并報(bào)錯(cuò)。例如,假定LIST分區(qū)的采用上面的方案,下面的查詢(xún)將失敗:

    INSERT INTO employees VALUES(224, 'Linus', 'Torvalds', '2002-05-01', '2004-10-12',?42,?21);

    這是因?yàn)椤皊tore_id”列值21不能在用于定義分區(qū)pNorth, pEast, pWest,或pCentral的值列表中找到。要重點(diǎn)注意的是,LIST分區(qū)沒(méi)有類(lèi)似如“VALUES LESS THAN MAXVALUE”這樣的包含其他值在內(nèi)的定義。將要匹配的任何值都必須在值列表中找到。

    3.hash分區(qū)

    CREATE TABLE employees (id INT NOT NULLstore_id int ) PARTITION BY HASH(store_id)PARTITIONS 4

    hash分區(qū)的目的是將數(shù)據(jù)均勻的分布到預(yù)先定義的各個(gè)分區(qū)中,保證各分區(qū)的數(shù)據(jù)數(shù)量大致一致。

    4.key分區(qū)

    CREATE TABLE employees (id INT NOT NULLstore_id int ) PARTITION BY key(store_id)PARTITIONS 4

    類(lèi)似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。

    五、管理分區(qū)語(yǔ)法

    取余:key,hash

    增加分區(qū)數(shù)量

    alter?table?employees?add?partition?partitions?1;

    減少分區(qū)數(shù)量

    alter?table?employees?coalesce?partition?1;

    采用取余算法的分區(qū)數(shù)量的修改,不會(huì)導(dǎo)致已有數(shù)據(jù)的丟失

    條件:list,range

    增加分區(qū)數(shù)量

    alter table employees add partition (partition pCenter VALUES IN (13,14) )

    刪除分區(qū)

    alter?table?employees?drop?partition?pNorth;

    ==注意==:刪除條件算法的分區(qū)將會(huì)導(dǎo)致已有數(shù)據(jù)的丟失

    六、選擇分區(qū)算法

    平均分配(key,hash):就按照主鍵進(jìn)行key即可(非常常見(jiàn))

    按照某種業(yè)務(wù)邏輯進(jìn)行分區(qū)(range,list):選擇那種整數(shù)型做分區(qū)字段或者最容易被篩選的字段


    分表

    1.水平分表:根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到兩個(gè)獨(dú)立的表中。

    2.垂直分割:把主碼和一些列放到一個(gè)表,然后把主碼和另外的列放到另一個(gè)表中。

    原來(lái)一個(gè)表中有a,b,c,d四個(gè)字段,垂直就是豎著切一刀,分成a,b一個(gè)表,c,d一個(gè)表。通過(guò)同一個(gè)字段關(guān)聯(lián)起來(lái)。
    水平么,比如將ID=1的用戶(hù)所產(chǎn)生的所有記錄放在Table1,ID=2的放在Table2,兩個(gè)Table字段完全一樣。。
    主要就是豎著切一刀,或者橫著切一刀的區(qū)別。

    總結(jié)

    以上是生活随笔為你收集整理的mysql分区、分表学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。