小編給大家分享一下在MySQL中怎么分庫分表,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
網(wǎng)站的建設(shè)創(chuàng)新互聯(lián)公司專注網(wǎng)站定制,經(jīng)驗(yàn)豐富,不做模板,主營網(wǎng)站定制開發(fā).小程序定制開發(fā),H5頁面制作!給你煥然一新的設(shè)計(jì)體驗(yàn)!已為成都陽光房等企業(yè)提供專業(yè)服務(wù)。
正文:
——————————————————————————————
在MYSQL的使用中,經(jīng)常會(huì)有人問怎么分庫分表,經(jīng)常會(huì)聽到兩種答案。
1 分庫分表,我們使用業(yè)務(wù)邏輯 + 業(yè)務(wù)程序的方式來進(jìn)行,并期根據(jù)實(shí)際的環(huán)境將系統(tǒng)中的一些表分割到不同的MYSQL 服務(wù)器上存儲(chǔ),達(dá)到以下兩個(gè)關(guān)鍵問題的解決。
1 受制于MYSQL本身的單表的存儲(chǔ)能力,這樣處理將擴(kuò)展MYSQL的單表的存儲(chǔ)能力。
2 受制于MYSQL 單機(jī)(包括基于 MGR集群 , MHA高可用)本身數(shù)據(jù)吞吐能力,將數(shù)據(jù)打散后,提高了數(shù)據(jù)庫的存儲(chǔ)速度,和數(shù)據(jù)的提取速度。
這恐怕是分庫分表中最重要的需求。
2 分庫分表,使用中間件的方式,進(jìn)行分表的操作,這是另一種分表的方式,與上邊的方式相比,這樣的方式更加的通用,通過中間件的方式將數(shù)據(jù)流自動(dòng)分割到不同的MYSQL 數(shù)據(jù)庫服務(wù)器上,以達(dá)到和上邊使用特定邏輯達(dá)到同樣的效果,滿足數(shù)據(jù)的存儲(chǔ)擴(kuò)展和更大吞吐量的需求。
那1 和 2 兩種分表的方案,之間的區(qū)別,個(gè)人理解 1 方案更貼近業(yè)務(wù),并且如果是自己的公司來研發(fā)方案,則出錯(cuò),排錯(cuò),都比較方便。但如果自己定義的方案出現(xiàn)問題,并且已經(jīng)上了一段生產(chǎn),如果反悔修改上成本就比較高了。
方案2 采用中間件的方式來說,是大部分,或者說需要快速上線,業(yè)務(wù)方面方向比較靈活,而且需要分表的表,有點(diǎn)多的情況下,采用的一種方式。
從成本上看1 方案要投入的人力,物力會(huì)比較多,方案2 投入的人力,物力比較少,由于中間件是根據(jù)很多業(yè)務(wù)的需求而來所產(chǎn)生的,所以通用性比較強(qiáng),適應(yīng)力也比較高。方案1 那就看各家自己的開發(fā)水平和經(jīng)驗(yàn)了。
但為什么方案2在成本較低的情況下 ,有些公司沒有用也總結(jié)了以下幾點(diǎn)
1 中間件的使用,牽扯整體關(guān)鍵業(yè)務(wù)(分表的表一般都是業(yè)務(wù)中的主力)自己研發(fā)分庫分表的方案更有底。
2 中間件的某些設(shè)計(jì)上的問題,對復(fù)雜的查詢語句執(zhí)行,數(shù)據(jù)的返回,事務(wù)下發(fā)后,失敗的處理等等,都要復(fù)雜與單庫系統(tǒng),所以怕后期出現(xiàn)問題,無法解決,所以不使用。
這里從邏輯的角度來看中間件
1 中間件的自帶的主鍵生成的邏輯,是否能滿足企業(yè)業(yè)務(wù)中設(shè)想的邏輯,滿足開發(fā)的對于主鍵設(shè)計(jì)的需求。
2 中間件對于支持的MYSQL的語法的標(biāo)準(zhǔn),以及是否可以承受一些復(fù)雜語句的查詢,降低開發(fā)人員在設(shè)計(jì)系統(tǒng)時(shí)的難度。
3 中間件在不使用后,數(shù)據(jù)的遷移,維護(hù),改變分庫分表的更改的成本的問題。
基于上面的幾點(diǎn)考慮,標(biāo)準(zhǔn)化,穩(wěn)定性,有相關(guān)支持等等是應(yīng)該被考慮在使用中間件的基礎(chǔ)上的一個(gè)考量。
在細(xì)節(jié)方面,使用中間件考慮的范圍會(huì)更多一些
比如對于學(xué)習(xí)成本的需求,中間件的加入不應(yīng)該提高使用數(shù)據(jù)庫的成本,無論是從人員還是技術(shù)方面,與原有的數(shù)據(jù)庫的使用方式越貼近越好。
支持原生的數(shù)據(jù)庫協(xié)議,這也是降低學(xué)習(xí)成本,提高使用的方便感的一個(gè)應(yīng)該由的標(biāo)準(zhǔn)。
當(dāng)然對中間件的要求中看似沒有特點(diǎn),但很難做到的部分,就是事務(wù)的回滾,在一個(gè)MYSQL 數(shù)據(jù)庫中進(jìn)行事務(wù)的回滾,是在正常不過的事情, 而將一個(gè)事務(wù)下發(fā)到多臺(tái)MYSQL 并且在進(jìn)行事務(wù)回滾,這就不是一件簡單的事情。
1 對于多個(gè)MYSQL 節(jié)點(diǎn)中,某個(gè)節(jié)點(diǎn)的失敗如何處理
2 對于執(zhí)行計(jì)劃如何打散到多個(gè)節(jié)點(diǎn)執(zhí)行,并且保持執(zhí)行效率
3 整體事務(wù)在操作失敗后,如何進(jìn)行事務(wù)的回滾
4 對復(fù)雜SQL 的拆分,將復(fù)雜的查詢拆分為基本的關(guān)系代數(shù)查詢樹,在下發(fā)到各個(gè)節(jié)點(diǎn),然后返回?cái)?shù)據(jù)在進(jìn)行合并等等。
5 對于復(fù)雜的SQL的執(zhí)行后的數(shù)據(jù)返回的正確性。
基于中間件的復(fù)雜,以及要求,其實(shí)我們可以使用的中間件并沒有太多的選擇大部分都是在使用mycat,更加清晰的了解和理解MYSQL中間件的定義,則是如何搞好分庫分表的第一步,實(shí)際上也是有其他的中間件可以選擇。
看完了這篇文章,相信你對“在MYSQL中怎么分庫分表”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!