Mysql數(shù)據(jù)庫(kù)大表優(yōu)化方案和Mysql大表優(yōu)化步驟(3)
當(dāng)MySQL單表記錄數(shù)過(guò)大時(shí),增刪改查性能都會(huì)急劇下降,可以參考以下步驟來(lái)優(yōu)化。單表優(yōu)化 除非單表數(shù)據(jù)未來(lái)會(huì)一直不斷上漲,否則不要一開(kāi)始就考慮拆分,拆分會(huì)帶來(lái)邏輯、部...
解決方案
由于水平拆分牽涉的邏輯比較復(fù)雜,當(dāng)前也有了不少比較成熟的解決方案。這些方案分為兩大類(lèi):客戶(hù)端架構(gòu)和代理架構(gòu)。
客戶(hù)端架構(gòu)
通過(guò)修改數(shù)據(jù)訪(fǎng)問(wèn)層,如JDBC、Data Source、MyBatis,通過(guò)配置來(lái)管理多個(gè)數(shù)據(jù)源,直連數(shù)據(jù)庫(kù),并在模塊內(nèi)完成數(shù)據(jù)的分片整合,一般以Jar包的方式呈現(xiàn)
這是一個(gè)客戶(hù)端架構(gòu)的例子:
可以看到分片的實(shí)現(xiàn)是和應(yīng)用服務(wù)器在一起的,通過(guò)修改Spring JDBC層來(lái)實(shí)現(xiàn)
客戶(hù)端架構(gòu)的優(yōu)點(diǎn)是:
-
應(yīng)用直連數(shù)據(jù)庫(kù),降低外圍系統(tǒng)依賴(lài)所帶來(lái)的宕機(jī)風(fēng)險(xiǎn)
-
集成成本低,無(wú)需額外運(yùn)維的組件
缺點(diǎn)是:
-
限于只能在數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)層上做文章,擴(kuò)展性一般,對(duì)于比較復(fù)雜的系統(tǒng)可能會(huì)力不從心
-
將分片邏輯的壓力放在應(yīng)用服務(wù)器上,造成額外風(fēng)險(xiǎn)
代理架構(gòu)
通過(guò)獨(dú)立的中間件來(lái)統(tǒng)一管理所有數(shù)據(jù)源和數(shù)據(jù)分片整合,后端數(shù)據(jù)庫(kù)集群對(duì)前端應(yīng)用程序透明,需要獨(dú)立部署和運(yùn)維代理組件
這是一個(gè)代理架構(gòu)的例子:
代理組件為了分流和防止單點(diǎn),一般以集群形式存在,同時(shí)可能需要Zookeeper之類(lèi)的服務(wù)組件來(lái)管理
代理架構(gòu)的優(yōu)點(diǎn)是:
-
能夠處理非常復(fù)雜的需求,不受數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)層原來(lái)實(shí)現(xiàn)的限制,擴(kuò)展性強(qiáng)
-
對(duì)于應(yīng)用服務(wù)器透明且沒(méi)有增加任何額外負(fù)載
缺點(diǎn)是:
-
需部署和運(yùn)維獨(dú)立的代理中間件,成本高
-
應(yīng)用需經(jīng)過(guò)代理來(lái)連接數(shù)據(jù)庫(kù),網(wǎng)絡(luò)上多了一跳,性能有損失且有額外風(fēng)險(xiǎn)
各方案比較
如此多的方案,如何進(jìn)行選擇?可以按以下思路來(lái)考慮:
-
確定是使用代理架構(gòu)還是客戶(hù)端架構(gòu)。中小型規(guī)?;蚴潜容^簡(jiǎn)單的場(chǎng)景傾向于選擇客戶(hù)端架構(gòu),復(fù)雜場(chǎng)景或大規(guī)模系統(tǒng)傾向選擇代理架構(gòu)
-
具體功能是否滿(mǎn)足,比如需要跨節(jié)點(diǎn)
ORDER BY
,那么支持該功能的優(yōu)先考慮 -
不考慮一年內(nèi)沒(méi)有更新的產(chǎn)品,說(shuō)明開(kāi)發(fā)停滯,甚至無(wú)人維護(hù)和技術(shù)支持
-
最好按大公司->社區(qū)->小公司->個(gè)人這樣的出品方順序來(lái)選擇
-
選擇口碑較好的,比如github星數(shù)、使用者數(shù)量質(zhì)量和使用者反饋
-
開(kāi)源的優(yōu)先,往往項(xiàng)目有特殊需求可能需要改動(dòng)源代碼
按照上述思路,推薦以下選擇:
-
客戶(hù)端架構(gòu):ShardingJDBC
-
代理架構(gòu):MyCat或者Atlas
兼容MySQL且可水平擴(kuò)展的數(shù)據(jù)庫(kù)
目前也有一些開(kāi)源數(shù)據(jù)庫(kù)兼容MySQL協(xié)議,如:
-
TiDB(https://github.com/pingcap/tidb)
-
Cubrid(http://www.cubrid.org)
但其工業(yè)品質(zhì)和MySQL尚有差距,且需要較大的運(yùn)維投入,如果想將原始的MySQL遷移到可水平擴(kuò)展的新數(shù)據(jù)庫(kù)中,可以考慮一些云數(shù)據(jù)庫(kù):
-
阿里云PetaData(https://cn.aliyun.com/product/petadata/?spm=5176.7960203.237031.38.cAzx5r)
-
阿里云OceanBase(https://cn.aliyun.com/product/oceanbase?spm=5176.7960203.237031.40.cAzx5r)
-
騰訊云DCDB(https://www.qcloud.com/product/dcdbfortdsql.html)
NOSQL
在MySQL上做Sharding是一種戴著鐐銬的跳舞,事實(shí)上很多大表本身對(duì)MySQL這種RDBMS的需求并不大,并不要求ACID,可以考慮將這些表遷移到NoSQL,徹底解決水平擴(kuò)展問(wèn)題,例如:
-
日志類(lèi)、監(jiān)控類(lèi)、統(tǒng)計(jì)類(lèi)數(shù)據(jù)
-
非結(jié)構(gòu)化或弱結(jié)構(gòu)化數(shù)據(jù)
-
對(duì)事務(wù)要求不強(qiáng),且無(wú)太多關(guān)聯(lián)操作的數(shù)據(jù)
原文出處:https://segmentfault.com/a/1190000006158186
END
- 如何使用Access數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單MIS管理系統(tǒng)
- Access數(shù)據(jù)庫(kù)日常維護(hù)和Access數(shù)據(jù)庫(kù)優(yōu)化方法
- MariaDB數(shù)據(jù)庫(kù)的外鍵約束實(shí)例代碼介紹詳解
- Windows10系統(tǒng)下MariaDB數(shù)據(jù)庫(kù)安裝教程圖解
- Mysql數(shù)據(jù)庫(kù)創(chuàng)建存儲(chǔ)過(guò)程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方
- Mysql數(shù)據(jù)庫(kù)自定義函數(shù)的定義、使用方法及操作注意事
- Mysql數(shù)據(jù)庫(kù)的max_allowed_packet設(shè)定方法
- Mysql數(shù)據(jù)庫(kù)亂碼出現(xiàn)的各個(gè)階段以及對(duì)應(yīng)方法
- MySQL數(shù)據(jù)庫(kù)的事務(wù)處理用法與實(shí)例代碼詳解
- Mysql數(shù)據(jù)庫(kù)使用from與join兩表查詢(xún)的方法區(qū)別總結(jié)
如何使用Access數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單MIS管理系統(tǒng)
MIS管理系統(tǒng)也是一種很實(shí)用的管理系統(tǒng),可以將很多東西都放的井井有條,便于大家查找,下文中就以大家家中都有的CD、VCD為例,為大家介紹如何建立一個(gè)MIS管理系統(tǒng),使這些東西有條理。...
Access數(shù)據(jù)庫(kù)日常維護(hù)和Access數(shù)據(jù)庫(kù)優(yōu)化方法
文章主要介紹了Access數(shù)據(jù)庫(kù)日常維護(hù)方法(優(yōu)化),適用范圍:使用Access作為數(shù)據(jù)庫(kù)建設(shè)的網(wǎng)站。需要的朋友可以參考下...
MariaDB數(shù)據(jù)庫(kù)的外鍵約束實(shí)例代碼介紹詳解
文章主要給大家介紹了關(guān)于MariaDB數(shù)據(jù)庫(kù)的外鍵約束的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧...
Windows10系統(tǒng)下MariaDB數(shù)據(jù)庫(kù)安裝教程圖解
文章給大家介紹Windows10系統(tǒng)下安裝MariaDB 的教程圖解,感興趣的朋友一起看看吧,MariaDB由MySQL的創(chuàng)始人麥克爾·維德紐斯主導(dǎo)開(kāi)發(fā),...
Mysql數(shù)據(jù)庫(kù)創(chuàng)建存儲(chǔ)過(guò)程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法
本文實(shí)例講述了mysql創(chuàng)建存儲(chǔ)過(guò)程實(shí)現(xiàn)往數(shù)據(jù)表中新增字段的方法,結(jié)合實(shí)例形式對(duì)比分析了通過(guò)存儲(chǔ)過(guò)程新增字段相關(guān)操作技巧,需要的朋友可以參考下。...
Mysql數(shù)據(jù)庫(kù)自定義函數(shù)的定義、使用方法及操作注意事項(xiàng)
文章主要介紹了MySQL自定義函數(shù)簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了mysql自定義函數(shù)的基本定義、使用方法及操作注意事項(xiàng),需要的朋友可以參考下。...
Mysql數(shù)據(jù)庫(kù)的max_allowed_packet設(shè)定方法
小編為大家分享一篇關(guān)于Mysql的max_allowed_packet設(shè)定,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧...
Mysql數(shù)據(jù)庫(kù)亂碼出現(xiàn)的各個(gè)階段以及對(duì)應(yīng)方法
MySQL中數(shù)據(jù)庫(kù)亂碼一般進(jìn)行字符集的設(shè)定即可,但是亂碼可以出現(xiàn)在各個(gè)階段,所以這篇文章整理一下亂碼出現(xiàn)的各個(gè)階段以及對(duì)應(yīng)方法。...
MySQL數(shù)據(jù)庫(kù)的事務(wù)處理用法與實(shí)例代碼詳解
文章主要介紹了mysql事務(wù)處理用法與實(shí)例代碼詳解,詳細(xì)的介紹了事物的特性和用法并實(shí)現(xiàn)php和mysql事務(wù)處理例子,非常具有實(shí)用價(jià)值,需要的朋友可以參考下...
Mysql數(shù)據(jù)庫(kù)使用from與join兩表查詢(xún)的方法區(qū)別總結(jié)
文章主要給大家介紹了關(guān)于mysql使用from與join兩表查詢(xún)的區(qū)別的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面...