什麼是分表和分區 MySql數據庫分區和分表辦法。本站提示廣大學習愛好者:(什麼是分表和分區 MySql數據庫分區和分表辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是什麼是分表和分區 MySql數據庫分區和分表辦法正文
1、為什麼要分表和分區
日常開發中我們常常會遇到大表的狀況,所謂的大表是指存儲了百萬級乃至千萬級條記載的表。這樣的表過於龐大,招致數據庫在查詢和拔出的時分耗時太長,功能低下,假如觸及結合查詢的狀況,功能會愈加蹩腳。分表和表分區的目的就是增加數據庫的擔負,進步數據庫的效率,通常點來講就是進步表的增刪改查效率。
2、什麼是分表和分區
2.1 分表
分表是將一個大表依照一定的規則分解成多張具有獨立存儲空間的實體表,我們可以稱為子表,每個表都對應三個文件,MYD數據文件,.MYI索引文件,.frm表構造文件。這些子表可以散布在同一塊磁盤上,也可以在不同的機器上。app讀寫的時分依據事前定義好的規則失掉對應的子表名,然後去操作它。
2.2 分區
分區和分表類似,都是依照規則分解表。不同在於分表將大表分解為若干個獨立的實體表,而分區是將數據分段劃分在多個地位寄存,可以是同一塊磁盤也可以在不同的機器。分區後,外表上還是一張表,但數據散列到多個地位了。app讀寫的時分操作的還是大表名字,db自動去組織分區的數據。
分區的次要目的是為了在特定的SQL操作中增加數據讀寫的總量以縮減呼應時間。
2.3 mysql分表和分區有什麼聯絡呢?
1)、都能進步mysql的功能,在高並發形態下都有一個良好的表現。
2)、分表和分區不矛盾,可以互相配合的,關於那些大訪問量,並且表數據比擬多的表,我們可以采取分表和分區結合的方式,訪問量不大,但是表數據很多的表,我們可以采取分區的方式等。
3)、分表技術是比擬費事的,需求手動去創立子表,app服務端讀寫時分需求計算子表名。采用merge好一些,但也要創立子表和配置子表間的union關系。
4)、表分區絕對於分表,操作方便,不需求創立子表。
3、分表的幾種方式
3.1 mysql集群
它並不是分表,但起到了和分表相反的作用。集群可分擔數據庫的操作次數,將義務分擔到多台數據庫上。集群可以讀寫別離,增加讀寫壓力。從而提升數據庫功能。
3.2 自定義規則分表
大表可以依照業務的規則來分解為多個子表。通常為以下幾品種型,也可自己定義規則。
Range(范圍)–這種形式允許將數據劃分不同范圍。例如可以將一個表經過年份劃分紅若干個分區。
Hash(哈希)–這中形式允許經過對表的一個或多個列的Hash Key停止計算,最後經過這個Hash碼不同數值對應的數據區域停止分區。例如可以樹立一個對表主鍵停止分區的表。
Key(鍵值)–下面Hash形式的一種延伸,這裡的Hash Key是MySQL零碎發生的。
List(預定義列表)–這種形式允許零碎經過預定義的列表的值來對數據停止聯系。
Composite(復合形式)–以上形式的組合運用
分表規則與分區規則一樣,在分區模塊詳細引見。
上面以Range復雜引見下如何分表(依照年份表)。
假定表構造有4個字段:自增id,姓名,存款金額,存款日期
把存款日期作為規則分表,辨別創立幾個表
2011年:account_2011
2012年:account_2012
……
2015年:account_2015
app在讀寫的時分依據日期來查找對應的表名,需求手動來斷定。
var getTableName = function() { var data = { name: 'tom', money: 2800.00, date: '201410013059' }; var tablename = 'account_'; var year = parseInt(data.date.substring(0, 4)); if (year < 2012) { tablename += 2011; // account_2011 } else if (year < 2013) { tablename += 2012; // account_2012 } else if (year < 2014) { tablename += 2013; // account_2013 } else if (year < 2015) { tablename += 2014; // account_2014 } else { tablename += 2015; // account_2015 } return tablename; }
3.3 應用merge存儲引擎來完成分表
merge分表,分為主表和子表,主表相似於一個殼子,邏輯上封裝了子表,實踐上數據都是存儲在子表中的。
我們可以經過主表拔出和查詢數據,假如清楚分表規律,也可以直接操作子表。
子表2011年
CREATE TABLE `account_2011` ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `money` float NOT NULL , `tradeDate` datetime NOT NULL PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=2 CHECKSUM=0 ROW_FORMAT=DYNAMIC DELAY_KEY_WRITE=0 ;
子表2012年
CREATE TABLE `account_2012` ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `money` float NOT NULL , `tradeDate` datetime NOT NULL PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=2 CHECKSUM=0 ROW_FORMAT=DYNAMIC DELAY_KEY_WRITE=0 ;
主表,一切年
CREATE TABLE `account_all` ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `money` float NOT NULL , `tradeDate` datetime NOT NULL PRIMARY KEY (`id`) ) ENGINE=MRG_MYISAM DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci UNION=(`account_2011`,`account_2012`) INSERT_METHOD=LAST ROW_FORMAT=DYNAMIC ;
創立主表的時分有個INSERT_METHOD,指明拔出方式,取值可以是:0 不允許拔出;FIRST 拔出到UNION中的第一個表; LAST 拔出到UNION中的最後一個表。
經過主表查詢的時分,相當於將一切子表合在一同查詢。這樣並不能表現分表的優勢,建議還是查詢子表。
4、分區的幾種方式
4.1 Range
create table range( id int(11), money int(11) unsigned not null, date datetime )partition by range(year(date))( partition p2007 values less than (2008), partition p2008 values less than (2009), partition p2009 values less than (2010) partition p2010 values less than maxvalue );
4.2 List
create table list( a int(11), b int(11) )(partition by list (b) partition p0 values in (1,3,5,7,9), partition p1 values in (2,4,6,8,0) );
4.3 Hash
create table hash( a int(11), b datetime )partition by hash (YEAR(b) partitions 4;
4.4 key
create table t_key( a int(11), b datetime) partition by key (b) partitions 4;
4.5 分區管理
4.5.1 新增分區
ALTER TABLE sale_data ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));
4.5.2 刪除分區
當刪除了一個分區,也同時刪除了該分區中一切的數據。
ALTER TABLE sale_data DROP PARTITION p201010;
4.5.3 兼並分區
上面的SQL,將p201001 - p201009 兼並為3個分區p2010Q1 - p2010Q3
ALTER TABLE sale_data REORGANIZE PARTITION p201001,p201002,p201003, p201004,p201005,p201006, p201007,p201008,p201009 INTO ( PARTITION p2010Q1 VALUES LESS THAN (201004), PARTITION p2010Q2 VALUES LESS THAN (201007), PARTITION p2010Q3 VALUES LESS THAN (201010) );
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。