今天就跟大家聊聊有關(guān)復(fù)雜的數(shù)據(jù)需求的MySQL方案是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)2013年至今,先為蒙陰等服務(wù)建站,蒙陰等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為蒙陰企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
前些天處理了一個需求,當(dāng)時的數(shù)據(jù)庫環(huán)境是Oracle,我算是想盡了Oracle相關(guān)的方案,而且在問題的處理過程中,還在不斷的琢磨,如果失敗了還有什么其他的方案。
所以盡管Oracle這么一個成熟的商業(yè)數(shù)據(jù)庫,做起來還是有些難度,需要一些額外的技巧,比如規(guī)避bug,間接實現(xiàn)需求等。
但是換個角度,2億多數(shù)據(jù)的表,其實MySQL也不是新鮮事兒了。如果MySQL碰到了這種情況,該怎么處理呢。
梳理業(yè)務(wù)需求
假設(shè)業(yè)務(wù)需求還是不變,如下:
業(yè)務(wù)同學(xué)反饋,數(shù)據(jù)庫中有一個表數(shù)據(jù)量很大,因為要做一期活動,需要近期的數(shù)據(jù),以前的舊數(shù)據(jù)可以考慮清理。清理多少舊數(shù)據(jù)呢,差不多是99%的量,數(shù)據(jù)量有多大呢,差不多兩個億。所以這個需求聽起來蠻簡單,但是業(yè)務(wù)同學(xué)明確希望能夠保持業(yè)務(wù)的可持續(xù)性,這樣一來就對實現(xiàn)方案有了一些選擇。
這個看起來簡單的需求,有下面的一些補充信息,數(shù)據(jù)庫為MySQL 5.6,數(shù)據(jù)量有2億,數(shù)據(jù)查詢效率非常差,99%以上都是臟數(shù)據(jù),需要清理,開發(fā)同學(xué)是根據(jù)時間范圍來進行查詢;表里的數(shù)據(jù)只有insert,沒有update和delete。
總結(jié)下來,要做4件事情:
優(yōu)化查詢,目前是基于時間范圍來查詢,經(jīng)過評估需要給這個表添加索引
清理數(shù)據(jù),表里有兩億數(shù)據(jù),但是要清理絕大部分?jǐn)?shù)據(jù)。
保證業(yè)務(wù)的可持續(xù)性,每10分鐘會做一次統(tǒng)計分析,數(shù)據(jù)會實時錄入系統(tǒng)
把表修改為分區(qū)表,把舊數(shù)據(jù)放入一個分區(qū),新數(shù)據(jù)放入另一個分區(qū),變更之后刪除就分區(qū)即可
梳理需求優(yōu)先級
如此一來,給這個表添加索引就是亟待解決的關(guān)鍵問題。
MySQL里面的online DDL功能還是很不錯的,對于索引的操作,5.6版本支持還是很全的。
所以MySQL online DDL原生的方案就很不錯,如果是5.5也沒關(guān)系還有pt-osc工具等可以實現(xiàn)。
大道至簡,思路相通
而對此的一個解決方案如下,數(shù)據(jù)流和之前Oracle的方案如出一轍,但是實現(xiàn)原理和細節(jié)有所差別。
首先需要做得就是生成一個影子表serverlog_read,對于源庫的表數(shù)據(jù)變更都能夠同步到這個表里。
MySQL里面是不支持物化視圖的,所以增量刷新等等方案就會受限,但是辦法總比困難多,MySQL里面要實現(xiàn)物化視圖還是有一些其他的方法的,比如說Flexviews,或者是自己實現(xiàn),通過觸發(fā)器的形式來實現(xiàn)需求,這里insert,delete,update都需要有觸發(fā)條件,所以pt工具默認(rèn)會創(chuàng)建的也是3個觸發(fā)器,原理很相似。
有了這個物化視圖,緩存增量數(shù)據(jù)就有了基本保證,所以我們還需要兩個輔助的表,一個是serverlog_par_old,這是個分區(qū)表,只保留一個分區(qū),里面會存放物化視圖里查到的刷新數(shù)據(jù),另外一個是serverlog_host,這里面存放的是增量數(shù)據(jù)和實時錄入系統(tǒng)的數(shù)據(jù)。
這個時候其實有三種類別的數(shù)據(jù)處理需要考慮,第一類是舊數(shù)據(jù),也可以理解為冷數(shù)據(jù),第二類是增量數(shù)據(jù),比如指定近一個月的數(shù)據(jù)需要保留,那么這個時間范圍內(nèi)的數(shù)據(jù)就是增量數(shù)據(jù),第三類是實時數(shù)據(jù),數(shù)據(jù)會實時錄入系統(tǒng),這個數(shù)據(jù)近乎是實時的。所以說上面的方案就是對冷數(shù)據(jù)能夠歸檔,對增量數(shù)據(jù)能夠合理截取,對實時數(shù)據(jù)產(chǎn)生盡可能小的影響。
2億的數(shù)據(jù)怎么合1千萬的數(shù)據(jù)進行切換呢,MySQL 5.6也是支持exchange partition的。所以這個操作支持起來是沒有問題的,畢竟分區(qū)的操作就是這么幾種玩法。MySQL因為其自身存儲的特性,實現(xiàn)這個需求其實更純粹。
最后就是增量,實時數(shù)據(jù)的補錄,利用serverlog_hot來補數(shù)據(jù)就行。
方案之外的兩點補充
額外補充兩點,也是MySQL在這個實現(xiàn)過程的兩個亮點。
第一個亮點就是MySQL復(fù)制表結(jié)構(gòu)有著得天獨厚的優(yōu)勢,大家知道在MySQL 5.6中是不支持create table xxxx as select xx這種方式的,但是有很多更絕的方法。
我們可以改寫為下面的方式來做:
1.create table test1 like test; --這種方式能夠完整的復(fù)制DDL信息。
或者使用show create table來做,當(dāng)然這個略有些不方面,或者是使用mysqldump --no-date的方式來導(dǎo)出語句也可以。
2.插入數(shù)據(jù),比如insert into test1 select *from test;
第二個亮點部分就是對于數(shù)據(jù)的備份歸檔,說簡單簡單,說復(fù)雜復(fù)雜,比如我們嚴(yán)格限定數(shù)據(jù)的有效性,不需要的舊數(shù)據(jù)就不在當(dāng)前的數(shù)據(jù)庫中保留,但是為了實現(xiàn)基本的備份需求,我們可以使用rename user的方式來做。Oracle實現(xiàn)rename user還是有些復(fù)雜的,而MySQL實現(xiàn)起來就很輕巧。說得通俗一些,就是把里面的數(shù)據(jù)挪到另外一個目錄下了。
要處理這樣一個需求,毫無疑問盡管我信息滿滿,但是在實踐的時候還是是困難重重,碰到了問題多思考和總結(jié),就會形成自己的認(rèn)知體系,會少走很多彎路。
看完上述內(nèi)容,你們對復(fù)雜的數(shù)據(jù)需求的MySQL方案是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。