程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL分區技術(一)

MySQL分區技術(一)

編輯:MySQL綜合教程

MySQL分區技術(一)


4:MySQL 分區技術(是mysql 5.1以版本後開始用->是甲骨文mysql技術團隊維護人員以插件形式插入到mysql裡面的技術)

目前,針對海量數據的優化主要有2中方法:

1:大表拆成小表的方式(物理上)

一:垂直分表->一張垂直切成幾張

二:水平分表(一般重點)->橫切,意思就是一張表有100個數據橫切10張表,一張表存10條(字段一致)

2:SQL語句的優化(可以通過增加索引等來調整,但是數據量大的增大會導致索引的維護代價增大)

水平分區技術將一個表拆成多個表,比較常用的方式是將表中的記錄按照某種hash算法進行拆分,簡單的拆分方法如取摸

方式。同樣,這種分區方法也必須對前端的應用程序中的SQL進行修改方可以使用。而且對於一個SQL,它可能會修改兩個

表,那麼你必須地寫出2個SQL語句從而可以完成一個邏輯事務,使得程序的判斷邏輯越來越復雜,這樣也導致程序的維護代價

高,也就失去了采用數據庫的優勢。

*因此:分區技術可以有力地避免如上的弊端,成為解決海量數據存儲的有力方法。

分區技術:

->>有效解決了:物理上拆分多個表,邏輯上操作一個表表明不變

->>MySQL分區技術介紹(*主要用的是range 和 list 分區*):

-----分區在邏輯上是一張表,在硬件/物理上是多張表,就是拆分表索引和數據-----

MySQL的分區技術不同與之前的分表技術,它與水平分表有點類似,但是它在邏輯層進行的水平分表,

對與應用程序而言它還是一張表,

MySQL5.1版本後有4中分區類型:

一:RANGE分區(用的最多):基於屬於一個給定連續區間的列值(字段),把多行分配給分區  -->基於女字段為參考點來進行分區

--將一個表拆分成:索引文件,數據文件分片存儲

二:LIST分區:類似於按range分區,區別在於list分區是基於列值匹配一個離散值集合中的某個值來進行選擇(列裡面的值是固定值時候來進行分區,而且是枚舉類型的值適合用list分區  -->比如說 性別:男,女)

三:HASH分區:基於用戶定義的表達式的返回值來進行選擇的分區,改表達式使用將要插入到表中的這些行的列值計算,這個函數可以包含MySQL中有效的、產生負整數值的任何表達式

--->把每次插入的數據隨機的平均的分配到多個分區裡面,最終多個分區裡面的數據時平均分配的,但是每個分區裡面的數值肯能不太一樣,因為是隨機分配的(一般可以用來做MySQL分區的測試來使用)

四:KEY分區:類似於按hash分區,區別在於key分區只支持計算一列或多列,且MySQL服務器提供其自身的哈希函數

測試一下(測試用hash類型的):->myisam增刪改查的速度快
create table t2(id int)engine=myisam
partition by hash(id)
partitions 5;                 ->能後當你插入數據的時候就會隨機分配插入個個分區中
建立一個存儲
\d //         ->修改結束符號  之前是;號改成 //
create procedure p5()
begin
set @i=1;
while @i<100000 do
insert into t4 values(@i);
set @i=@i+1;
end while;
end //

執行剛才建立的存儲
call p3()     ->表p3就插入了9999條數據

innodb的數據結構:

分為:共享表空間及其獨占表空間

一:innodb表結構共享表空間不能做成分區表:

所有文件的數據和索引都在ibddata1(比如你建了2個表會對應生成frm文件,但是2個表的所有數據和索引全部在這個文件裡面共用,所有不能對表做正真的分區,初始值是10M)

原因:數據和索引全都是放在一個文件裡面 .ibddata1文件

二:innodb表結構要想做出分區表必須是“獨占表空間”

原因:數據和索引全都是獨立的一個文件

開啟獨占空間:(*必須配置文件中開啟文件才能做出獨占表空間,才能做成分區表*)
innodb_data_home_dir = C:\mysql\data\
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = C:\mysql\data\
innodb_file_per_table=1   ->配置文件中innodb下方加上
重啟:MySQL   -->pkill mysqld 關閉進程  重新啟動MySQL-bin/mysqld_safe --user=mysql &

測試:
create table t4(id int)engine=innodb
partition by RANGE(id)(
partition p0 values less than(10000),
partition p1 values less than(20000),
PARTITION p2 VALUES less than MAXVALUE);

能後你在創建innodb類型的數據表後,你會發現建一個x表就有x.frm x.ibd文件,就不會和其他表放到一起從而做表分區

*重點總結:只有把innodb設置成獨立的表空間後,才能創建innodb表引擎的表分區

相關命令:
/s;   查看詳細信息版本啊編碼啊 什麼的。。。
show engines; 查看默認表引擎
show plugins; 查看當前MySQL的所有插件,可以查看是否支持分區partition
show index from from tabName;  查看索引
show procedure status; 查看簡歷的存儲

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved