前言
可能說起mysql缚甩,哪怕一個剛?cè)腴T的小白都會跟我說,太低級了窑邦,這玩意有什么可整的擅威,沒啥意思,除了增刪改查冈钦,索引郊丛,序列,還有什么呢瞧筛?真當哥們是二B了呀
我就哈哈一笑厉熟,小伙子,還是太年輕啊较幌,來看這張圖(平臺原因揍瑟,像素不夠,需要高清圖绅络,關(guān)注公眾號:Java架構(gòu)師聯(lián)盟,私信“架構(gòu)圖”獲揉易帧)
怎么樣恩急,兄弟,密集恐懼癥是不是犯了啊纪蜒,還敢說mysql簡單嘛衷恭?但是這樣說的話是不是跟我的題目有點不一樣啊,別著急纯续,接著往下看
增刪改查什么的都不說随珠,咱就以mysql的優(yōu)化為例,來證明一下猬错,為什么我說真的不難
既然要說MySQL優(yōu)化窗看,那我們起碼要先知道現(xiàn)在的MySQL已經(jīng)為了讓操作更容易,給我們提供了那些方便吧
MySQL24種系統(tǒng)特性
1.使用 C和C++編寫倦炒,并使用了多種編譯器進行測試显沈,保證了源代碼的可移植性。
2.支持AIX、FreeBSD拉讯、HP-UX涤浇、Linux、Mac OS魔慷、NovellNetware只锭、OpenBSD、OS/2 Wrap院尔、Solaris蜻展、Windows等多種操作系統(tǒng)。
3.為多種編程語言提供了API召边。這些編程語言包括C铺呵、C++、Python隧熙、Java片挂、Perl、PHP贞盯、Eiffel音念、Ruby,.NET和 Tcl 等。
4.支持多線程躏敢,充分利用 CPU 資源闷愤。
5.優(yōu)化的SQL查詢算法,有效地提高查詢速度件余。
6.既能夠作為一個單獨的應(yīng)用程序應(yīng)用在客戶端服務(wù)器網(wǎng)絡(luò)環(huán)境中讥脐,也能夠作為一個庫而嵌入到其他的軟件中。
7.提供多語言支持啼器,常見的編碼如中文的GB 2312旬渠、BIG5,日文的Shift_JIS等都可以用作數(shù)據(jù)表名和數(shù)據(jù)列名端壳。
8.提供TCP/IP告丢、ODBC 和JDBC等多種數(shù)據(jù)庫連接途徑。
9.提供用于管理损谦、檢查岖免、優(yōu)化數(shù)據(jù)庫操作的管理工具。
10.支持大型的數(shù)據(jù)庫照捡÷妫可以處理擁有上千萬條記錄的大型數(shù)據(jù)庫。
11.支持多種存儲引擎栗精。
12.MySQL 是開源的栅炒,所以你不需要支付額外的費用。
13.MySQL 使用標準的SQL數(shù)據(jù)語言形式。
14.MySQL 對 PHP 有很好的支持赢赊,PHP是比較流行的 Web 開發(fā)語言乙漓。
15.MySQL是可以定制的,采用了GPL協(xié)議释移,你可以修改源碼來開發(fā)自己的 MySQL 系統(tǒng)叭披。
16.在線 DDL/更改功能,數(shù)據(jù)架構(gòu)支持動態(tài)應(yīng)用程序和開發(fā)人員靈活性(5.6新增)
17.復(fù)制全局事務(wù)標識玩讳,可支持自我修復(fù)式集群(5.6新增)
18.復(fù)制無崩潰從機涩蜘,可提高可用性(5.6新增)
19.復(fù)制多線程從機,可提高性能(5.6新增)
20.3倍更快的性能(5.7[7]新增)
21.新的優(yōu)化器(5.7新增)
22.原生JSON支持(5.7新增)
23.多源復(fù)制(5.7新增)
24.GIS的空間擴展[8](5.7新增)
好噠熏纯,那知道了這些之后同诫,我們接下來看調(diào)優(yōu),這也是在面試的過程中被經(jīng)常問到的一些問題樟澜,而且隨著互聯(lián)網(wǎng)的發(fā)展误窖,數(shù)據(jù)量的增大,不想引入大數(shù)據(jù)體系的秩贰,那只能在數(shù)據(jù)庫上下功夫了霹俺,那么對于數(shù)據(jù)庫的調(diào)優(yōu),不知道各位覺得難嗎毒费?其實真的不難丙唧,不信,看下面
MySQL調(diào)優(yōu)思維導(dǎo)圖
看到這張思維導(dǎo)圖觅玻,從上往下想际,不知道在看這篇文章的你有沒有回想一下自己的知識體系中,這些方面是不是很清晰呢溪厘?
好胡本,看完這句話,我的重點要來了桩匪,你在回想這些知識點的時候打瘪,是不是對你的知識點進行了一個回顧和梳理友鼻,查漏補缺傻昙,你也知道了自己知識點上的不足,是不是可以有針對性的進行學(xué)習(xí)呢彩扔?
我們以分庫和分表為例去進行一個商討
分庫分表
1妆档、水平分庫
概念:以字段為依據(jù),按照一定策略(hash虫碉、range等)贾惦,將一個庫中的數(shù)據(jù)拆分到多個庫中。
結(jié)果:
每個庫的結(jié)構(gòu)都一樣;
每個庫的數(shù)據(jù)都不一樣须板,沒有交集碰镜;
所有庫的并集是全量數(shù)據(jù);
場景:系統(tǒng)絕對并發(fā)量上來了习瑰,分表難以根本上解決問題绪颖,并且還沒有明顯的業(yè)務(wù)歸屬來垂直分庫。
分析:庫多了甜奄,io和cpu的壓力自然可以成倍緩解柠横。
2、水平分表
概念:以字段為依據(jù)课兄,按照一定策略(hash牍氛、range等),將一個表中的數(shù)據(jù)拆分到多個表中烟阐。
結(jié)果:
每個表的結(jié)構(gòu)都一樣搬俊;
每個表的數(shù)據(jù)都不一樣,沒有交集曲饱;
所有表的并集是全量數(shù)據(jù)悠抹;
場景:系統(tǒng)絕對并發(fā)量并沒有上來,只是單表的數(shù)據(jù)量太多扩淀,影響了SQL效率楔敌,加重了CPU負擔,以至于成為瓶頸驻谆。推薦:一次SQL查詢優(yōu)化原理分析
分析:表的數(shù)據(jù)量少了卵凑,單次SQL執(zhí)行效率高,自然減輕了CPU的負擔胜臊。
3勺卢、垂直分庫
概念:以表為依據(jù),按照業(yè)務(wù)歸屬不同象对,將不同的表拆分到不同的庫中黑忱。
結(jié)果:
每個庫的結(jié)構(gòu)都不一樣;
每個庫的數(shù)據(jù)也不一樣勒魔,沒有交集甫煞;
所有庫的并集是全量數(shù)據(jù);
場景:系統(tǒng)絕對并發(fā)量上來了冠绢,并且可以抽象出單獨的業(yè)務(wù)模塊抚吠。
分析:到這一步,基本上就可以服務(wù)化了弟胀。例如楷力,隨著業(yè)務(wù)的發(fā)展一些公用的配置表喊式、字典表等越來越多,這時可以將這些表拆到單獨的庫中萧朝,甚至可以服務(wù)化岔留。再有,隨著業(yè)務(wù)的發(fā)展孵化出了一套業(yè)務(wù)模式检柬,這時可以將相關(guān)的表拆到單獨的庫中贸诚,甚至可以服務(wù)化。
4厕吉、垂直分表
概念:以字段為依據(jù)酱固,按照字段的活躍性,將表中字段拆到不同的表(主表和擴展表)中头朱。
結(jié)果:
每個表的結(jié)構(gòu)都不一樣运悲;
每個表的數(shù)據(jù)也不一樣,一般來說项钮,每個表的字段至少有一列交集班眯,一般是主鍵,用于關(guān)聯(lián)數(shù)據(jù)烁巫;
所有表的并集是全量數(shù)據(jù)署隘;
場景:系統(tǒng)絕對并發(fā)量并沒有上來,表的記錄并不多亚隙,但是字段多磁餐,并且熱點數(shù)據(jù)和非熱點數(shù)據(jù)在一起,單行數(shù)據(jù)所需的存儲空間較大阿弃。以至于數(shù)據(jù)庫緩存的數(shù)據(jù)行減少诊霹,查詢時會去讀磁盤數(shù)據(jù)產(chǎn)生大量的隨機讀IO,產(chǎn)生IO瓶頸渣淳。
分析:可以用列表頁和詳情頁來幫助理解脾还。垂直分表的拆分原則是將熱點數(shù)據(jù)(可能會冗余經(jīng)常一起查詢的數(shù)據(jù))放在一起作為主表,非熱點數(shù)據(jù)放在一起作為擴展表入愧。這樣更多的熱點數(shù)據(jù)就能被緩存下來鄙漏,進而減少了隨機讀IO。拆了之后棺蛛,要想獲得全部數(shù)據(jù)就需要關(guān)聯(lián)兩個表來取數(shù)據(jù)怔蚌。
但記住,千萬別用join鞠值,因為join不僅會增加CPU負擔并且會將兩個表耦合在一起(必須在一個數(shù)據(jù)庫實例上)媚创。關(guān)聯(lián)數(shù)據(jù)渗钉,應(yīng)該在業(yè)務(wù)Service層做文章彤恶,分別獲取主表和擴展表數(shù)據(jù)然后用關(guān)聯(lián)字段關(guān)聯(lián)得到全部數(shù)據(jù)钞钙。
好了,到這里声离,分庫和分表的操作基本就完成了芒炼,不知道大家有沒有什么感覺,如果知識只是單純的去看這些知識點术徊,你能記住多久呢本刽?反正如果我長時間不看,就忘了赠涮,子寓,但是我不慫 啊,因為我有這張圖笋除,而且比展示出來的更加詳細斜友,所以當我需要用到時候就可以看了,直接就可以拿出來看垃它,哪怕只有10分鐘就夠了鲜屏。
不知道你怎么感覺,其實我覺得你也可以国拇,當你學(xué)完之后洛史,在我的這張知識圖譜上,把會的知識點進行整理酱吝,不會的知識點在學(xué)完之后也可以整理到這份圖譜中也殖,即使后面用不到有所遺忘,但是當你需要這些資料的時候务热,比方說你要面試了毕源,那你會覺得慌嘛?是不是拿出來這張圖就可以啊陕习,想看那個知識點點開看一下就可以了霎褐。
其實,今天的標題是有一點不是特別準確该镣,其實每一個程序員們都清楚冻璃,不僅僅是數(shù)據(jù)庫,其他 的技術(shù)也是這樣损合,從Java基礎(chǔ)(源碼等)---架構(gòu)師---大數(shù)據(jù)----人工智能省艳,哪怕你不從事這一行,難道就不能去學(xué)習(xí)了嗎嫁审?互聯(lián)網(wǎng)發(fā)展這么快跋炕,天知道那天就能用到呢?
人無遠慮必有近憂律适,好了辐烂,兄弟們遏插,時間已經(jīng)很晚了,就到這里吧
關(guān)注我纠修,后期不斷更新新的文章胳嘲,包括面試、技術(shù)扣草、學(xué)習(xí)等技術(shù)了牛,關(guān)注我,不迷路辰妙,有什么問題鹰祸,也可以在評論區(qū)或者私信和我交流
覺得文章寫的不錯的老鐵們,歡迎點贊+評論密浑,支持一下福荸,謝謝
公眾號:Java架構(gòu)師聯(lián)盟,歡迎關(guān)注