轉mysql對于大表(千萬級),要怎么優化呢? 原鏈接:http://www.zhihu.com/question/19719997 提問:如何設計或優化千萬級別的大表?此外無其他信息,個人覺得這個話題有點范,就只好簡單說下該如何做,對于一個存儲設計,必須考慮業務特點,收集的信息如下: 1.
<轉>mysql對于大表(千萬級),要怎么優化呢?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
更多信息參見:
MySQL數據庫服務器端核心參數詳解和推薦配置
http://www.mysqlops.com/2011/10/26/mysql-variables-one.html
不紙上談兵,說一下我的思路以及我的解決,拋磚引玉了
我最近正在解決這個問題
我現在的公司有三張表,是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
6
7
8
太多了,洗澡去先- -
當然,我還是紙上談兵了,lz把上下文給足,我可以幫你看一下
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com