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

2021-08-18 21:08:47 字數 2966 閱讀 1949

19條規則摘要如下:

規則1:一般情況可以選擇myisam儲存引擎,如果需要事務支援必須使用innodb儲存引擎。

規則2:命名規則。

規則3:資料庫字段型別定義

經常需要計算和排序等消耗cpu的字段,應該盡量選擇更為迅速的字段,如用timestamp(4個位元組,最小值1970-01-01 00:00:00)代替datetime(8個位元組,最小值1001-01-01 00:00:00),通過整型替代浮點型和字元型

變長字段使用varchar,不要使用char

對於二進位制多**資料,流水佇列資料(如日誌),超大文字資料不要放在資料庫欄位中

規則4:業務邏輯執行過程必須讀到的表中必須要有初始的值。避免業務讀出為負或無窮大的值導致程式失敗

規則5:並不需要一定遵守正規化理論,適度的冗餘,讓query儘量減少join

規則6:訪問頻率較低的大字段拆分出資料表。有些大字段占用空間多,訪問頻率較其他字段明顯要少很多,這種情況進行拆分,頻繁的查詢中就不需要讀取大字段,造成io資源的浪費。

規則7:大表可以考慮水平拆分。大表影響查詢效率,根據業務特性有很多拆分方式,像根據時間遞增的資料,可以根據時間來分。以id劃分的資料,可根據id%資料庫個數的方式來拆分。

規則8:業務需要的相關索引是根據實際的設計所構造sql語句的where條件來確定的,業務不需要的不要建索引,不允許在聯合索引(或主鍵)中存在多於的字段。特別是該字段根本不會在條件語句中出現。

規則9:唯一確定一條記錄的乙個欄位或多個欄位要建立主鍵或者唯一索引,不能唯一確定一條記錄,為了提高查詢效率建普通索引

規則10:業務使用的表,有些記錄數很少,甚至只有一條記錄,為了約束的需要,也要建立索引或者設定主鍵。

規則11:對於取值不能重複,經常作為查詢條件的字段,應該建唯一索引(主鍵預設唯一索引),並且將查詢條件中該字段的條件置於第乙個位置。沒有必要再建立與該字段有關的聯合索引。

規則12:對於經常查詢的字段,其值不唯一,也應該考慮建立普通索引,查詢語句中該字段條件置於第乙個位置,對聯合索引處理的方法同樣。

規則13:業務通過不唯一索引訪問資料時,需要考慮通過該索引值返回的記錄稠密度,原則上可能的稠密度最大不能高於0.2,如果稠密度太大,則不合適建立索引了。

規則14:需要聯合索引(或聯合主鍵)的資料庫要注意索引的順序。sql語句中的匹配條件也要跟索引的順序保持一致。

注意:索引的順勢不正確也可能導致嚴重的後果。

規則15:表中的多個字段查詢作為查詢條件,不含有其他索引,並且字段聯合值不重複,可以在這多個欄位上建唯一的聯合索引,假設索引欄位為 (a1,a2,...an),則查詢條件(a1 op val1,a2 op val2,...am op valm)m<=n,可以用到索引,查詢條件中字段的位置與索引中的字段位置是一致的。

規則16:聯合索引的建立原則(以下均假設在資料庫表的字段a,b,c上建立聯合索引(a,b,c))

規則17:重要業務訪問資料表時。但不能通過索引訪問資料時,應該確保順序訪問的記錄數目是有限的,原則上不得多於10.

規則18:合理構造query語句

規則19:應用系統的優化

1.優化你的sql和索引;

2.加快取,memcached,redis;

3.做主從複製或主主複製,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護;

4.mysql自帶分割槽表,先試試這個,對你的應用是透明的,無需更改**,但是sql語句是需要針對分割槽表做優化的,sql條件中要帶上分割槽條件的列,從而使查詢定位到少量的分割槽上,否則就會掃瞄全部分割槽,另外分割槽表還有一些坑,在這裡就不多說了;

5.做垂直拆分,其實就是根據你模組的耦合度,將乙個大的系統分為多個小的系統,也就是分布式系統;

6.水平切分,針對資料量大的表,這一步最麻煩,最能考驗技術水平,要選擇乙個合理的sharding key,為了有好的查詢效率,表結構也要改動,做一定的冗餘,應用也要改,sql中盡量帶sharding key,將資料定位到限定的表上去查,而不是掃瞄全部的表;

7、選取最適用的字段屬性

8、使用連線(join)來代替子查詢(sub-queries)

9、使用聯合(union)來代替手動建立的臨時表

10、事務

11、鎖定表

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

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_size

以及調整一些引數值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_size 

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

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

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

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

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

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