Java高級工程師必備知識!高級java工程師面試技術

為什么要分庫分表?

首先回答一下為什么要分庫分表,答案很簡單:數據庫出現性能瓶頸。用大白話來說就是數據庫快扛不住了。

數據庫出現性能瓶頸,對外表現有幾個方面:

  • 大量請求阻塞在高并發場景下,大量請求都需要操作數據庫,導致連接數不夠了,請求處于阻塞狀態。
  • SQL 操作變慢如果數據庫中存在一張上億數據量的表,一條 SQL 沒有命中索引會全表掃描,這個查詢耗時會非常久。
  • 存儲出現問題業務量劇增,單庫數據量越來越大,給存儲造成巨大壓力。

從機器的角度看,性能瓶頸無非就是CPU、內存、磁盤、網絡這些,要解決性能瓶頸最簡單粗暴的辦法就是提升機器性能,但是通過這種方法成本和收益投入比往往又太高了,不劃算,所以重點還是要從軟件角度入手。

數據庫相關優化方案

數據庫優化方案很多,主要分為兩大類:軟件層面、硬件層面。

軟件層面包括:SQL 調優、表結構優化、讀寫分離、數據庫集群、分庫分表等;

硬件層面主要是增加機器性能。

SQL 調優

SQL 調優往往是解決數據庫問題的第一步,往往投入少部分精力就能獲得較大的收益。

SQL 調優主要目的是盡可能地讓那些慢 SQL 變快,手段其實也很簡單就是讓 SQL 執行盡量命中索引。

開啟慢 SQL 記錄

如果你使用的是 Mysql,需要在 Mysql 配置文件中配置幾個參數即可。

slow_query_log=on
long_query_time=1
slow_query_log_file=/path/to/log

調優的工具

常常會用到 explain 這個命令來查看 SQL 語句的執行計劃,通過觀察執行結果很容易就知道該 SQL 語句是不是全表掃描、有沒有命中索引。

select id, age, gender from  user where name = '愛笑的架構師';

返回有一列叫“type”,常見取值有:

ALL、index、range、 ref、eq_ref、const、system、NULL(從左到右,性能從差到好)

ALL 代表這條 SQL 語句全表掃描了,需要優化。一般來說需要達到range 級別及以上。

表結構優化

以一個場景舉例說明:

“user”表中有 user_id、nickname 等字段,“order”表中有order_id、user_id等字段,如果想拿到用戶昵稱怎么辦?一般情況是通過 join 關聯表操作,在查詢訂單表時關聯查詢用戶表,從而獲取到用戶昵稱。

但是隨著業務量增加,訂單表和用戶表肯定也是暴增,這時候通過兩個表關聯數據就比較費力了,為了取一個昵稱字段而不得不關聯查詢幾十上百萬的用戶表,其速度可想而知。

這個時候可以嘗試將 nickname 這個字段加到 order 表中(order_id、user_id、nickname),這種做法通常叫做數據庫表冗余字段。這樣做的好處展示訂單列表時不需要再關聯查詢用戶表了。

冗余字段的做法也有一個弊端,如果這個字段更新會同時涉及到多個表的更新,因此在選擇冗余字段時要盡量選擇不經常更新的字段。

架構優化

當單臺數據庫實例扛不住,我們可以增加實例組成集群對外服務。

當發現讀請求明顯多于寫請求時,我們可以讓主實例負責寫,從實例對外提供讀的能力;

如果讀實例壓力依然很大,可以在數據庫前面加入緩存如 redis,讓請求優先從緩存取數據減少數據庫訪問。

緩存分擔了部分壓力后,數據庫依然是瓶頸,這個時候就可以考慮分庫分表的方案了,后面會詳細介紹。

硬件優化

硬件成本非常高,一般來說不可能遇到數據庫性能瓶頸就去升級硬件。

在前期業務量比較小的時候,升級硬件數據庫性能可以得到較大提升;但是在后期,升級硬件得到的收益就不那么明顯了。

分庫分表詳解

下面我們以一個商城系統為例逐步講解數據庫是如何一步步演進。

單應用單數據庫

在早期創業階段想做一個商城系統,基本就是一個系統包含多個基礎功能模塊,最后打包成一個 war 包部署,這就是典型的單體架構應用。

如上圖,商城系統包括主頁 Portal 模板、用戶模塊、訂單模塊、庫存模塊等,所有的模塊都共有一個數據庫,通常數據庫中有非常多的表。

因為用戶量不大,這樣的架構在早期完全適用,開發者可以拿著 demo到處找(騙)投資人。

一旦拿到投資人的錢,業務就要開始大規模推廣,同時系統架構也要匹配業務的快速發展。

多應用單數據庫

在前期為了搶占市場,這一套系統不停地迭代更新,代碼量越來越大,架構也變得越來越臃腫,現在隨著系統訪問壓力逐漸增加,系統拆分就勢在必行了。

為了保證業務平滑,系統架構重構也是分了幾個階段進行。

第一個階段將商城系統單體架構按照功能模塊拆分為子服務,比如:Portal 服務、用戶服務、訂單服務、庫存服務等。

如上圖,多個服務共享一個數據庫,這樣做的目的是底層數據庫訪問邏輯可以不用動,將影響降到最低。

多應用多數據庫

隨著業務推廣力度加大,數據庫終于成為了瓶頸,這個時候多個服務共享一個數據庫基本不可行了。我們需要將每個服務相關的表拆出來單獨建立一個數據庫,這其實就是“分庫”了。

單數據庫的能夠支撐的并發量是有限的,拆成多個庫可以使服務間不用競爭,提升服務的性能。

如上圖,從一個大的數據中分出多個小的數據庫,每個服務都對應一個數據庫,這就是系統發展到一定階段必要要做的“分庫”操作。

現在非常火的微服務架構也是一樣的,如果只拆分應用不拆分數據庫,不能解決根本問題,整個系統也很容易達到瓶頸。

分表

說完了分庫,那什么時候分表呢?

如果系統處于高速發展階段,拿商城系統來說,一天下單量可能幾十萬,那數據庫中的訂單表增長就特別快,增長到一定階段數據庫查詢效率就會出現明顯下降。

因此,當單表數據增量過快,業界流傳是超過500萬的數據量就要考慮分表了。當然500萬只是一個經驗值,大家可以根據實際情況做出決策。

那如何分表呢?

分表有幾個維度,一是水平切分和垂直切分,二是單庫內分表和多庫內分表。

水平拆分和垂直拆分

就拿用戶表(user)來說,表中有7個字段:id,name,age,sex,nickname,description,如果 nickname 和 description 不常用,我們可以將其拆分為另外一張表:用戶詳細信息表,這樣就由一張用戶表拆分為了用戶基本信息表+用戶詳細信息表,兩張表結構不一樣相互獨立。但是從這個角度來看垂直拆分并沒有從根本上解決單表數據量過大的問題,因此我們還是需要做一次水平拆分。

還有一種拆分方法,比如表中有一萬條數據,我們拆分為兩張表,id 為奇數的:1,3,5,7……放在 user1, id 為偶數的:2,4,6,8……放在 user2中,這樣的拆分辦法就是水平拆分了。

水平拆分的方式也很多,除了上面說的按照 id 拆表,還可以按照時間維度去拆分,比如訂單表,可以按每日、每月等進行拆分。

  • 每日表:只存儲當天的數據。
  • 每月表:可以起一個定時任務將前一天的數據全部遷移到當月表。
  • 歷史表:同樣可以用定時任務把時間超過 30 天的數據遷移到 history表。

總結一下水平拆分和垂直拆分的特點:

  • 垂直切分:基于表或字段劃分,表結構不同。
  • 水平切分:基于數據劃分,表結構相同,數據不同。

單庫內拆分和多庫拆分

拿水平拆分為例,每張表都拆分為了多個子表,多個子表存在于同一數據庫中。比如下面用戶表拆分為用戶1表、用戶2表。

在一個數據庫中將一張表拆分為幾個子表在一定程度上可以解決單表查詢性能的問題,但是也會遇到一個問題:單數據庫存儲瓶頸。

所以在業界用的更多的還是將子表拆分到多個數據庫中。比如下圖中,用戶表拆分為兩個子表,兩個子表分別存在于不同的數據庫中。

image

多庫拆分

一句話總結:分表主要是為了減少單張表的大小,解決單表數據量帶來的性能問題。

分庫分表帶來的復雜性

既然分庫分表這么好,那我們是不是在項目初期就應該采用這種方案呢?不要激動,冷靜一下,分庫分表的確解決了很多問題,但是也給系統帶來了很多復雜性,下面簡要說一說。

(1)跨庫關聯查詢

在單庫未拆分表之前,我們可以很方便使用 join 操作關聯多張表查詢數據,但是經過分庫分表后兩張表可能都不在一個數據庫中,如何使用 join 呢?

有幾種方案可以解決:

  • 字段冗余:把需要關聯的字段放入主表中,避免 join 操作;
  • 數據抽象:通過ETL等將數據匯合聚集,生成新的表;
  • 全局表:比如一些基礎表可以在每個數據庫中都放一份;
  • 應用層組裝:將基礎數據查出來,通過應用程序計算組裝;

(2)分布式事務

單數據庫可以用本地事務搞定,使用多數據庫就只能通過分布式事務解決了。

常用解決方案有:基于可靠消息(MQ)的解決方案、兩階段事務提交、柔性事務等。

(3)排序、分頁、函數計算問題

在使用 SQL 時 order by, limit 等關鍵字需要特殊處理,一般來說采用分片的思路:

先在每個分片上執行相應的函數,然后將各個分片的結果集進行匯總和再次計算,最終得到結果。

(4)分布式 ID

如果使用 Mysql 數據庫在單庫單表可以使用 id 自增作為主鍵,分庫分表了之后就不行了,會出現id 重復。

常用的分布式 ID 解決方案有:

  • UUID
  • 基于數據庫自增單獨維護一張 ID表
  • 號段模式
  • Redis 緩存
  • 雪花算法(Snowflake)
  • 百度uid-generator
  • 美團Leaf
  • 滴滴Tinyid

這些方案后面會寫文章專門介紹,這里不再展開。

(5)多數據源

分庫分表之后可能會面臨從多個數據庫或多個子表中獲取數據,一般的解決思路有:客戶端適配和代理層適配。

業界常用的中間件有:

  • shardingsphere(前身 sharding-jdbc)
  • Mycat

最后

再免費分享一波我的JAVA架構專題面試真題+解析+JAVA學習書籍:戳這里免費領取

image.png

層適配。

業界常用的中間件有:

  • shardingsphere(前身 sharding-jdbc)
  • Mycat

最后

再免費分享一波我的JAVA架構專題面試真題+解析+JAVA學習書籍:戳這里免費領取

[外鏈圖片轉存中…(img-29h3IHUA-1625205300871)]

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

html記事本制作靜態網頁,記事本編輯html靜態網頁設計(3頁)-原創力文檔

1 新建、打開、保存記事本2 靜態網頁格式*網頁碼開始*記事本制作網頁 *標題開始**標題結束*頭文件碼結束*歡迎瀏覽我的主頁 *主體內容**主體碼結束**網頁碼結束*網頁代碼都是以“<>> ”的格式成對出現的“<> ”表示開始“> ”表示結束&#xff0c;中間是網頁…

Java高級工程師必看系列,從基礎到源碼統統幫你搞定

1、Java基礎 Java基礎務必要有一個非常牢固的根基&#xff0c;尤其是對于JVM和并發編程的掌握情況**&#xff08;屬于進階內容&#xff0c;但也是Java最為重要的基礎內容&#xff09;**&#xff0c;不論是面試還是工作&#xff0c;基礎不好&#xff0c;寫不出高質量、漂亮的代…

計算機房的英語用諧音怎么讀,“人機對話”學英語 發音不準就過不了電腦關...

浙江在線11月24日訊杭州錢江新城有一所新建的學校——新城實驗學校。該校投資近5000萬元&#xff0c;占地39畝&#xff0c;規模36個班&#xff0c;是杭州采荷實驗學校教育集團的一個校區&#xff0c;是“民辦新校”的一種嘗試。11月22日&#xff0c;這所學校舉行落成典禮。經過…

Java高級工程師必看系列,已拿到offer

1.為什么要使用分布式鎖 使用分布式鎖的目的&#xff0c;無外乎就是保證同一時間只有一個客戶端可以對共享資源進行操作。 1.1舉一個很長的例子 系統 A 是一個電商系統&#xff0c;目前是一臺機器部署&#xff0c;系統中有一個用戶下訂單的接口&#xff0c;但是用戶下訂單之…

計算機網絡tcp三次握手,快速掌握_計算機網絡_TCP_三次握手

雖然這個話題已經是老生常談了&#xff0c;隨手一搜資料一堆&#xff0c;但是讓人快速掌握&#xff0c;我認為應該有幾個概念先被明確指出&#xff0c;再放出那張大同小異的時序圖。01關注的字段探討三次握手問題前&#xff0c;不得不先了解TCP報文段中存在的這四個位置&#x…

Java高級工程師每日面試題精選,面試經歷分享

MySQL為何不選擇平衡二叉樹 既然平衡二叉樹解決了普通二叉樹的問題&#xff0c;那么mysql為何不選擇平衡二叉樹作為索引呢? 索引需要存儲什么 讓我們想一想&#xff0c;如果我們要把索引存起來&#xff0c;那么應該存哪些信息呢&#xff0c;它應該存儲三塊信息&#xff1a;…

計算機考研英語詞匯書,求助:有知道電腦背考研英語單詞的

2017考研英語復習進行到今天&#xff0c;相信大家對背單詞都不陌生&#xff0c;背單詞是每個學生都會頭疼的地方&#xff0c;背了忘、忘了背如此惡性循環&#xff0c;到最后記住的單詞卻沒有幾個。面對這樣的結果&#xff0c;都教授想說&#xff1a;你背單詞的方法用對了嗎?背…

Java面試題目,java關鍵字final

1 進程 進程與程序 操作系統之中最為通用的概念就是「進程」。與此相關的面試題以及各種技術優化策略也層出不窮&#xff0c;足以夠證明它對于理解操作系統中舉足輕重的地位。事實上&#xff0c;通過「進程」&#xff0c;程序員可以更為直觀的理解自己所開發的軟件&#xff0…

工作組無法訪問計算機用戶,工作組計算機無法訪問,詳細教您工作組計算機無法訪問怎么解決...

電腦用戶反映稱在局域網中&#xff0c;查看工作組計算機時說無法訪問&#xff0c;沒有權限使用網絡資源。就是雙擊“查看工作組計算機”時&#xff0c;提示“Workgroup無法訪問。” what the fuck &#xff01;&#xff01;怎么解決&#xff1f;(泄氣)下面&#xff0c;小編給大…

Java面試題目,java工程師成神之路

2. ZooKeeper 介紹 2.1. ZooKeeper 由來 正式介紹 ZooKeeper 之前&#xff0c;我們先來看看 ZooKeeper 的由來&#xff0c;還挺有意思的。 下面這段內容摘自《從 Paxos 到 ZooKeeper 》第四章第一節&#xff0c;推薦大家閱讀一下&#xff1a; ZooKeeper 最早起源于雅虎研究院…

音樂計算機融合課,融合信息技術的音樂課

上一節共讀&#xff0c;陳蕾老師帶我們學習了雷圣峰老師如何在一堂以“生活中的青花紋飾”為主題的美術課上搭建教學腳手架并展現了信息技術與美術學科的融合。一直以來&#xff0c;很多教師認為像美術、音樂這樣的藝術學科在融合信息技術上是有一些困難的&#xff0c;上一節共…

Java面試題目,極客時間免費課程

一、對Kafka的認識 1.Kafka的基本概念 2.安裝與配置 3.生產與消費 4.服務端參數配置 二、生產者 1.客戶端開發 2.原理分析 3.重要的生產者參數 三、消費者 1.消費者與消費組 2.客戶端開發 四、主題與分區 1.主題的管理 2.初識KafkaAdminCilent 3.分區的管理 4.如何…

w7重啟計算機打印機無法使用,win7系統電腦重啟打印機服務就會被關閉的解決方法...

很多小伙伴都遇到過win7系統電腦重啟打印機服務就會被關閉的困惑吧&#xff0c;一些朋友看過網上零散的win7系統電腦重啟打印機服務就會被關閉的處理方法&#xff0c;并沒有完完全全明白win7系統電腦重啟打印機服務就會被關閉是如何解決的&#xff0c;今天小編準備了簡單的解決…

Java面試題!centos安裝yum

技術焦慮 現在的技術圈子很火熱&#xff0c;任何技術點&#xff0c;任何知識&#xff0c;只要你肯搜索&#xff0c;都能找到資料。但是現在技術圈確實有一個不好的地方&#xff0c;就是販賣焦慮。這種販賣焦慮的點并不在于形式&#xff0c;而是一種普遍的心態。特別是對于那種…

2016年全國計算機技術與軟件,2016年的上半年的全國計算機技術與軟件專業技術資格(水平)考.doc...

2016年的上半年的全國計算機技術與軟件專業技術資格(水平)考.doc (1頁)本資源提供全文預覽&#xff0c;點擊全文預覽即可全文預覽,如果喜歡文檔就下載吧&#xff0c;查找使用更方便哦&#xff01;19.90 積分&#xfeff;2011年上半年全國計算機技術與軟件專業技術資格(水平)考試…

Java面試題!java面向對象程序設計答案

一、對Kafka的認識 1.Kafka的基本概念 2.安裝與配置 3.生產與消費 4.服務端參數配置 二、生產者 1.客戶端開發 必要的參數配置消息的發送序列化分區器生產者攔截器 2.原理分析 整體架構元數據的更新 3.重要的生產者參數 三、消費者 1.消費者與消費組 2.客戶端開發 必要的…

測試學生成績的軟件,《軟件測試-學生成績管理系統》.doc

宿遷學院軟件測試—學生成績管理系統姓名&#xff1a; *****班級&#xff1a;計算機(3)班學號&#xff1a;******系部&#xff1a; 三 系指導老師&#xff1a;*****成績&#xff1a;目錄目錄21引言31.1開發系統目標31.2開發系統背景31.3用戶需求31.4系統組成32功能要求42.1系統…

Java面試題,java培訓北京哪家好

一、公務員都不要35歲以上的&#xff0c;何況大公司 這讓很多人感到惶恐&#xff0c;現在職場上有一種現象&#xff1a;很多用人單位會在招聘信息上明確標注&#xff0c;年齡需在35歲以下。為什么有經驗、有人脈的職場中年人會如此遭“嫌棄”呢&#xff1f; 首先&#xff0c;…

計算機輔助外文文獻,計算機輔助夾具設計外文文獻.pdf

Computer-Aided Design 42 (2010) 1085–1094Contents lists available at ScienceDirectComputer-Aided Designjournal homepage: /locate/cadComputer aided fixture design: Recent research and trendsHui Wang a,?, Yiming (Kevin) Rong a,b , Hua Li b , Price Shaun ba…

Java面試題,java工程師求職簡歷

One&#xff1a;JVM實踐思維圖&#xff08;完整版&#xff09; Two&#xff1a; 走近Java 概述 Java技術體系Java發展史Java虛擬機家族&#xff1a;&#xff08;Sun Classic/Exact VM、HotSpot VM、Mobile/Embedded VM、BEA JRockit/IBM J9 VM、BEA Liquid VM/Azul VM、Apache…