最近這幾天正在忙這個最佳化的方案,一直沒時間耍,忙碌了一段時間終於還是拿下了這個項目?項目中不要每次都把程式上的問題,讓mysql資料庫來承擔,它只是個mysql而已。
問題1:針對MySQL Community5.5+版本最佳化業務執行速度,提高整體系統效率
測試伺服器硬體環境:Intel Core i5,8gb記憶體,7200rpm硬碟,Win7專業版
Table名稱 |
讀取頻率 |
寫入頻率 |
最低連續讀取速度 |
最低連續寫入速度 |
預估資料量 |
C…. |
頻繁 |
不頻繁 |
30行/150ms |
100行/s |
百萬行 |
D… |
頻繁 |
不頻繁 |
30行/150ms |
100行/s |
百萬行 |
De….. |
頻繁 |
不頻繁 |
30行/150ms |
10行/s |
萬行 |
St…… |
頻繁 |
不頻繁 |
30行/150ms |
100行/s |
百萬行 |
S…… |
頻繁 |
頻繁 |
30行/150ms |
100行/s |
百萬行 |
Pr... |
很頻繁 |
不頻繁 |
1000行/s-5000行/s |
100行/s |
百萬行/表 |
De……. |
很頻繁 |
頻繁 |
1000行/s-5000行/s |
1000行/s |
百萬行/表 |
De…… |
很頻繁 |
頻繁 |
1000行/s-5000行/s |
1000行/s |
百萬行/表 |
看到這個想到的是拆分表,不外乎就是表的縱向拆分和橫向拆分,我在項目中也遇到過類似的問題,當時也是使用mysql資料庫當時大概列數有800多,mysql資料一張表的欄位是不能有800多個,最開始測試的是用String 按照JSON的格式存入的資料庫,結果發現處理時加入了迴圈,反而使系統效能變得很慢匯出一個Excel也是很吃力的,最後採用分表大概分了9張,解決了問題,其實現在想想是不是使用對象的序列化,將序列化的對象存入資料庫呢,使用在從資料庫中取出來還原序列化使用,當時分表後滿足了需求就沒再測試對象的序列化的方法了。但是這次給的需求不需要縱向拆表,是否需要橫向拆表呢?測試一次先,每次的點子都是要測試的e。
有些時候在mysql中還是要善用limit,
除開主鍵其餘沒加索引,這樣上了百萬條的資料查詢應該是不存在問題,話不多說最佳化SQL吧。
但是插入還是存在問題,是否需要分表呢?如果只是上百萬還是可以不用分表的,如果分表就要處理好分頁查詢,刪除和增加的操作,我還是喜歡使用Mysql資料的同步,使用兩個mysql資料庫,伺服器ip分別為ip1和ip2,我們將ip1作為Master資料庫,把ip2作為slave伺服器,我們可以採用單項同步的方式,就是Master的資料是主要資料,然後slave主動去Master哪兒同步資料回來,太晚了,明天測試通過就可以開始最佳化項目了。
在資料庫中資料在100w多行時插入資料耗時2.822秒的時間,
問題2:大檔案上傳居然有這樣的要求,
檔案大小 |
Action |
最大執行記憶體佔用 |
內網最低傳輸速率(802.11g) |
50mb |
Upload |
5mb |
1mb/s |
500mb |
Upload |
5mb |
1mb/s |
5gb |
Upload |
5mb |
1mb/s |
10gb |
Upload |
5mb |
1mb/s |
50mb |
Download |
5mb |
1mb/s |
500mb |
Download |
5mb |
1mb/s |
5gb |
Download |
5mb |
1mb/s |
10gb |
Download |
5mb |
1mb/s |
以前遇到過一個視頻網站上傳要求也是最大4G左右,這次居然要上傳最大的有10G,
為提高大檔案傳輸速率,將目標檔案分成N塊檔案,對應啟動N個線程通過TCP/IP協議來傳 輸,傳輸檔案前先檢查是否存在該檔案的臨時檔案群,如果存在找出其斷點位置進行續傳,最後合并文 件。非同步分割發送,用目前最主流的FLASH+AJAX技術。ActionScript和HTML5是支援SOCKET通訊的,呵呵。
實現流程:
1 用戶端向服務端發送傳遞檔案啟動訊號(傳送檔案名字)
2 伺服器檢查是否包含有該檔案所對應的臨時檔案(eg, 傳輸file.txt,就檢查是否存在temp[i]file.txt,(i為 第N塊臨時檔案)),如果存在就發送所有臨時檔案的斷點位置給用戶端
3 用戶端更具檔案大小將檔案分為N塊(每塊預設大小為500M,可通過參數進行配置)以加快傳輸速率, 然後根據伺服器返回的斷點位置(如果有)對每塊檔案進行移位,移動到斷點位置進行續傳,如果伺服器 上沒有臨時檔案夾,就進行普通的傳送檔案
4當所有線程工作完成,合并所有臨時檔案夾。
大檔案上傳的問題已經實現使用的是serverlight實現的。測試通過了大概是5-6M每秒。