mysql 大量資料處理問題

2021-07-01 22:59:52 字數 2458 閱讀 7156

一、大量資料儲存問題解決方法

分割槽、分表

原則:多利用點記憶體,減輕磁碟io負載,因為io往往是資料庫伺服器的瓶頸 

區別:1,實現方式上 

mysql的分表是真正的分表,一張表分成很多表後,每乙個小表都是完正的一張表;

分割槽不一樣,一張大表進行分割槽後,他還是一張表,不會變成二張表,但是他存放資料的區塊變多了

2,資料處理上 

分表後,資料都是存放在分表裡,總表只是乙個外殼,訪問資料發生在乙個乙個的分表裡面;

分割槽呢,不存在分表的概念,分割槽只不過把存放資料的檔案分成了許多小塊,分割槽後的表呢,還是一張表。資料處理還是由自己來完成。

3,提高效能上 

a),分表後,單錶的併發能力提高了,磁碟i/o效能也提高了。併發能力為什麼提高了呢,因為查尋一次所花的時間變短了,

如果出現高併發的話,總表可以根據不同的查詢,將併發壓力分到不同的小表裡面。磁碟i/o效能怎麼搞高了呢,

本來乙個非常大的.myd檔案現在也分攤到各個小表的.myd中去了。 

b),mysql提出了分割槽的概念,我覺得就想突破磁碟i/o瓶頸,想提高磁碟的讀寫能力,來增加mysql效能。 

在這一點上,分割槽和分表的測重點不同,分表重點是訪問資料時,如何提高mysql併發能力上;而分割槽呢,如何突破磁碟的讀寫能力,

從而達到提高mysql效能的目的。 

4),實現的難易度上 

a),分表的方法有很多,用merge來分表,是最簡單的一種方式。這種方式根分割槽難易度差不多,並且對程式**來說可以做到透明的。

如果是用其他分表方式就比分區麻煩了。 

b),分割槽實現是比較簡單的,建立分割槽表,根建平常的表沒什麼區別,並且對開**端來說是透明的。 

分割槽:分割槽應該注意的事項:

1、 做分割槽時,要麼不定義主鍵,要麼把分割槽字段加入到主鍵中。

2、 分割槽字段不能為null,要不然怎麼確定分割槽範圍呢,所以盡量not null

二、分割槽的型別

range 分割槽:基於屬於乙個給定連續區間的列值,把多行分配給分割槽。

list 分割槽:類似於按range分割槽,區別在於list分割槽是基於列值匹配乙個離散值集合中的某個值來進行選擇。

hash分割槽:基於使用者定義的表示式的返回值來進行選擇的分割槽,該表示式使用將要插入到表中的這些行的列值進行計算。這個函式可以包》含mysql中有效的、產生非負整數值的任何表示式。

key分割槽:類似於按hash分割槽,區別在於key分割槽只支援計算一列或多列,且mysql伺服器提供其自身的雜湊函式。必須有一列或多列包含》整數值。

range分割槽

create table t_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 

);分表:

先建表:

mysql> create table t1 (

->    a int not null auto_increment primary key,

->    message char(20)) engine=myisam;

mysql> create table t2 (

->    a int not null auto_increment primary key,

->    message char(20)) engine=myisam;

mysql> insert into t1 (message) values ('testing'),('table'),('t1');

mysql> insert into t2 (message) values ('testing'),('table'),('t2');

mysql> create table total (

->    a int not null auto_increment,

->    message char(20), index(a))

->    engine=merge union=(t1,t2) insert_method=last;

其中t1,t2是分表

total是t1,t2兩個表所有的資料

查詢的時候

select * from toal

表面上看和普通表一樣,其實上這個查詢進行mysql分表查詢,只是對於操作者透明而已

插入的話也是

insert into total(message)values('message');

會預設插入last表,也就是t2表

大量資料處理問題

1.根據快速排序劃分的思想 1 遞迴對所有資料分成 a,b b b,d 兩個區間,b,d 區間內的數都是大於 a,b 區間內的數 2 對 b,d 重複 1 操作,直到最右邊的區間個數小於100個。注意 a,b 區間不用劃分 3 返回上乙個區間,並返回此區間的數字數目。接著方法仍然是對上一區間的左邊進...

海量資料處理問題

一 給乙個超過100g大小的log file,log中存著ip位址,設計演算法找到出現次數最多的ip位址?該題目要求的是出現次數最多的乙個,有時候題目也會變成求出現次數排名前k的ip位址,兩個問題的解題思路是一致的,只是求前k個會多乙個小步驟,就是建堆,所以現在學習一下,求前k個的思路。100g記憶...

海量資料處理問題

1 給乙個超過100g大小的log le,log中存著ip位址,設計演算法找到出現次數最多的ip位址。如何找到top k的ip 這樣的問題如果出現在資料量較小的情形下,用乙個map或者unordered map都能很快的處理,但是100g這樣的量級放在乙個map裡是絕對不可行的。因此,我們採用雜湊切...