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; 查看簡歷的存儲