mysql對於大表 千萬級 ,要怎麼優化呢

2021-09-06 08:20:58 字數 1908 閱讀 4853

提問:如何設計或優化千萬級別的大表?此外無其他資訊,個人覺得這個話題有點範,就只好簡單說下該如何做,對於乙個儲存設計,必須考慮業務特點,收集的資訊如下:

1.資料的容量:1-3年內會大概多少條資料,每條資料大概多少位元組;

2.資料項:是否有大字段,那些欄位的值是否經常被更新;

3.資料查詢sql條件:哪些資料項的列名稱經常出現在where、group by、order by子句中等;

4.資料更新類sql條件:有多少列經常出現update或delete 的where子句中;

5.sql量的統計比,如:select:update+delete:insert=多少?

6.預計大表及相關聯的sql,每天總的執行量在何數量級?

7.表中的資料:更新為主的業務 還是 查詢為主的業務

8.打算採用什麼資料庫物理伺服器,以及資料庫伺服器架構?

9.併發如何?

10.儲存引擎選擇innodb還是myisam?

大致明白以上10個問題,至於如何設計此類的大表,應該什麼都清楚了!

至於優化若是指建立好的表,不能變動表結構的話,那建議innodb引擎,多利用點記憶體,減輕磁碟io負載,因為io往往是資料庫伺服器的瓶頸。

另外對優化索引結構去解決效能問題的話,建議優先考慮修改類sql語句,使他們更快些,不得已只靠索引組織結構的方式,當然此話前提是, 索引已經建立的非常好,若是讀為主,可以考慮開啟query_cache, 以及調整一些引數值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_siz。

更多資訊參見:

mysql資料庫伺服器端核心引數詳解和推薦配置

不紙上談兵,說一下我的思路以及我的解決,拋磚引玉了

我最近正在解決這個問題

我現在的公司有三張表,是5億的資料,每天張表每天的增量是100w

每張表大概在10個columns左右

下面是我做的測試和對比

1.首先看engine,在大資料量情況下,在沒有做分割槽的情況下

mysiam比innodb在唯讀的情況下,效率要高13%左右

2.在做了partition之後,你可以去讀一下mysql的官方文件,其實對於partition,專門是對myisam做的優化,對於innodb,所有的資料是存在ibdata裡面的,所以即使你可以看到schema變了,其實沒有本質的變化

在分割槽出於同乙個physical disk下面的情況下,提公升大概只有1%

在分割槽在不同的physical disk下,我分到了三個不同的disks下,提公升大概在3%,其實所謂的吞吐量,由很多因素決定的,比如你的explain parition時候可以看到,record在那乙個分割槽,如果每個分割槽都有,其實本質上沒有解決讀的問題,這樣只會提公升寫的效率。

另外乙個問題在於,分割槽,你怎麼分,如果一張表,有三個column都是經常被用於做查詢條件的,其實是一件很悲慘的事情,因為你沒有辦法對所有的sql做針對性的分割槽,如果你只是如mysql官方文件上說的,只對時間做乙個分割槽,而且你也只用時間查詢的話,恭喜你

3.表主要用來讀還是寫,其實這個問題是不充分的,應該這樣問,你在寫入的時候,同時併發的查詢多麼?我的問題還比較簡單,因為mongodb的 shredding支援不能,在crush之後,還是回到mysql,所以在通常情況下,9am-9pm,寫入的情況很多,這個時候我會做乙個 view,view是基於最近被插入或者經常被查詢的,通過做view來分離讀取,就是說寫是在table上的,讀在進行邏輯判斷前是在view上操作的

4做一些archive table,比如先對這些大表做很多已有的統計分析,然後通過已有的分析+增量來解決

5如果你用mysiam,還有乙個問題你要注意,如果你的.configure的時候,加了乙個max index length引數的時候,當你的record數大於制定長度的時候,這個index會被disable

MySQL 對於千萬級的大表要怎麼優化?

很多人第一反應是各種切分 我給的順序是 第一優化你的sql和索引 第二加快取,memcached,redis 第三以上都做了後,還是慢,就做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護 第四如果以上都做了還...

MySQL 對於千萬級的大表要怎麼優化?

對大資料的資料庫管理優化的總結 常用的 優化sql 突出快字,使完成操作的時間最短 1 用索引提高效率 2 選擇有效率的表名順序,及資料結構及欄位 3 使用decode函式可以避免重複掃瞄相同記錄或重複連線相同的表 4 刪除重複記 5 過內部函式提高sql效率 讀寫分離 操作不在乙個表裡完成 1 主...

MySQL 對於千萬級的大表要怎麼優化?

很多人第一反應是各種切分 我給的順序是 第一優化你的sql和索引 第二加快取,memcached,redis 第三以上都做了後,還是慢,就做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護 第四如果以上都做了還...