轉(zhuǎn)mysql對于大表(千萬級),要怎么優(yōu)化呢? 原鏈接:http://www.zhihu.com/question/19719997 提問:如何設(shè)計或優(yōu)化千萬級別的大表?此外無其他信息,個人覺得這個話題有點范,就只好簡單說下該如何做,對于一個存儲設(shè)計,必須考慮業(yè)務(wù)特點,收集的信息如下: 1.
<轉(zhuǎn)>mysql對于大表(千萬級),要怎么優(yōu)化呢?2.數(shù)據(jù)項:是否有大字段,那些字段的值是否經(jīng)常被更新;
3.數(shù)據(jù)查詢SQL條件:哪些數(shù)據(jù)項的列名稱經(jīng)常出現(xiàn)在WHERE、GROUP BY、ORDER BY子句中等;
4.數(shù)據(jù)更新類SQL條件:有多少列經(jīng)常出現(xiàn)UPDATE或DELETE 的WHERE子句中;
5.SQL量的統(tǒng)計比,如:SELECT:UPDATE+DELETE:INSERT=多少?
6.預(yù)計大表及相關(guān)聯(lián)的SQL,每天總的執(zhí)行量在何數(shù)量級?
7.表中的數(shù)據(jù):更新為主的業(yè)務(wù) 還是 查詢?yōu)橹鞯臉I(yè)務(wù)
8.打算采用什么數(shù)據(jù)庫物理服務(wù)器,以及數(shù)據(jù)庫服務(wù)器架構(gòu)?
9.并發(fā)如何?
10.存儲引擎選擇InnoDB還是MyISAM?
大致明白以上10個問題,至于如何設(shè)計此類的大表,應(yīng)該什么都清楚了!
至于優(yōu)化若是指創(chuàng)建好的表,不能變動表結(jié)構(gòu)的話,那建議InnoDB引擎,多利用點內(nèi)存,減輕磁盤IO負載,因為IO往往是數(shù)據(jù)庫服務(wù)器的瓶頸
另外對優(yōu)化索引結(jié)構(gòu)去解決性能問題的話,建議優(yōu)先考慮修改類SQL語句,使他們更快些,不得已只靠索引組織結(jié)構(gòu)的方式,當(dāng)然此話前提是,
索引已經(jīng)創(chuàng)建的非常好,若是讀為主,可以考慮打開query_cache,
以及調(diào)整一些參數(shù)值:sort_buffer_size,read_buffer_size,read_rnd_buffer_size,join_buffer_size
更多信息參見:
MySQL數(shù)據(jù)庫服務(wù)器端核心參數(shù)詳解和推薦配置
http://www.mysqlops.com/2011/10/26/mysql-variables-one.html
不紙上談兵,說一下我的思路以及我的解決,拋磚引玉了
我最近正在解決這個問題
我現(xiàn)在的公司有三張表,是5億的數(shù)據(jù),每天張表每天的增量是100w
每張表大概在10個columns左右
下面是我做的測試和對比
1.首先看engine,在大數(shù)據(jù)量情況下,在沒有做分區(qū)的情況下
mysiam比innodb在只讀的情況下,效率要高13%左右
2.在做了partition之后,你可以去讀一下mysql的官方文檔,其實對于partition,專門是對myisam做的優(yōu)化,對于innodb,所有的數(shù)據(jù)是存在ibdata里面的,所以即使你可以看到schema變了,其實沒有本質(zhì)的變化
在分區(qū)出于同一個physical disk下面的情況下,提升大概只有1%
在分區(qū)在不同的physical disk下,我分到了三個不同的disks下,提升大概在3%,其實所謂的吞吐量,由很多因素決定的,比如你的explain parition時候可以看到,record在那一個分區(qū),如果每個分區(qū)都有,其實本質(zhì)上沒有解決讀的問題,這樣只會提升寫的效率。
另外一個問題在于,分區(qū),你怎么分,如果一張表,有三個column都是經(jīng)常被用于做查詢條件的,其實是一件很悲慘的事情,因為你沒有辦法對所有的sql做針對性的分區(qū),如果你只是如mysql官方文檔上說的,只對時間做一個分區(qū),而且你也只用時間查詢的話,恭喜你
3.表主要用來讀還是寫,其實這個問題是不充分的,應(yīng)該這樣問,你在寫入的時候,同時并發(fā)的查詢多么?我的問題還比較簡單,因為mongodb的shredding支持不能,在crush之后,還是回到mysql,所以在通常情況下,9am-9pm,寫入的情況很多,這個時候我會做一個view,view是基于最近被插入或者經(jīng)常被查詢的,通過做view來分離讀取,就是說寫是在table上的,讀在進行邏輯判斷前是在view上操作的
4做一些archive table,比如先對這些大表做很多已有的統(tǒng)計分析,然后通過已有的分析+增量來解決
5如果你用mysiam,還有一個問題你要注意,如果你的.configure的時候,加了一個max index length參數(shù)的時候,當(dāng)你的record數(shù)大于制定長度的時候,這個index會被disable
6
7
8
太多了,洗澡去先- -
當(dāng)然,我還是紙上談兵了,lz把上下文給足,我可以幫你看一下
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com