萬字總結!springcloud分布式限流

正文

作為后端開發,日常操作數據庫最常用的是寫操作和讀操作。讀操作我們下邊會講,這個分類里我們主要來看看寫操作時為什么會導致 SQL 變慢。

刷臟頁

臟頁的定義是這樣的:內存數據頁和磁盤數據頁不一致時,那么稱這個內存數據頁為臟頁。

那為什么會出現臟頁,刷臟頁又怎么會導致 SQL 變慢呢?那就需要我們來看看寫操作時的流程是什么樣的。

對于一條寫操作的 SQL 來說,執行的過程中涉及到寫日志,內存及同步磁盤這幾種情況。

這里要提到一個日志文件,那就是 redo log,位于存儲引擎層,用來存儲物理日志。在寫操作的時候,存儲引擎(這里討論的是 Innodb)會將記錄寫入到 redo log 中,并更新緩存,這樣更新操作就算完成了。后續操作存儲引擎會在適當的時候把操作記錄同步到磁盤里。

看到這里你可能會有個疑問,redo log 不是日志文件嗎,日志文件就存儲在磁盤上,那寫的時候豈不很慢嗎?

其實,寫redo log 的過程是順序寫磁盤的,磁盤順序寫減少了尋道等時間,速度比隨機寫要快很多(?類似Kafka存儲原理),因此寫 redo log 速度是很快的。

好了,讓我們回到開始時候的問題,為什么會出現臟頁,并且臟頁為什么會使?SQL 變慢。你想想,redo log 大小是一定的,且是循環寫入的。在高并發場景下,redo log 很快被寫滿了,但是數據來不及同步到磁盤里,這時候就會產生臟頁,并且還會阻塞后續的寫入操作。SQL 執行自然會變慢。

寫操作時 SQL 慢的另一種情況是可能遇到了鎖,這個很容易理解。舉個例子,你和別人合租了一間屋子,只有一個衛生間,你們倆同時都想去,但對方比你早了一丟丟。那么此時你只能等對方出來后才能進去。

對應到 Mysql 中,當某一條 SQL 所要更改的行剛好被加了鎖,那么此時只有等鎖釋放了后才能進行后續操作。

但是還有一種極端情況,你的室友一直占用著衛生間,那么此時你該怎么整,總不能尿褲子吧,多丟人。對應到Mysql 里就是遇到了死鎖或是鎖等待的情況。這時候該如何處理呢?

Mysql 中提供了查看當前鎖情況的方式:

通過在命令行執行圖中的語句,可以查看當前運行的事務情況,這里介紹幾個查詢結果中重要的參數:

當前事務如果等待時間過長或出現死鎖的情況,可以通過 「kill 線程ID」?的方式釋放當前的鎖。

這里的線程 ID 指表中?trx_mysql_thread_id?參數。

讀操作

說完了寫操作,讀操作大家可能相對來說更熟悉一些。SQL 慢導致讀操作變慢的問題在工作中是經常會被涉及到的。

慢查詢

在講讀操作變慢的原因之前我們先來看看是如何定位慢 SQL 的。Mysql 中有一個叫作慢查詢日志的東西,它是用來記錄超過指定時間的 SQL 語句的。默認情況下是關閉的,通過手動配置才能開啟慢查詢日志進行定位。

具體的配置方式是這樣的:

  • 查看當前慢查詢日志的開啟情況:

  • 開啟慢查詢日志(臨時):

注意這里只是臨時開啟了慢查詢日志,如果 mysql 重啟后則會失效。可以 my.cnf 中進行配置使其永久生效。

存在原因

知道了如何查看執行慢的 SQL 了,那么我們接著看讀操作時為什么會導致慢查詢。

(1)未命中索引

SQL 查詢慢的原因之一是可能未命中索引,關于使用索引為什么能使查詢變快以及使用時的注意事項,網上已經很多了,這里就不多贅述了。

(2)臟頁問題

另一種還是我們上邊所提到的刷臟頁情況,只不過和寫操作不同的是,是在讀時候進行刷臟頁的。

是不是有點懵逼,別急,聽我娓娓道來:

為了避免每次在讀寫數據時訪問磁盤增加 IO 開銷,Innodb 存儲引擎通過把相應的數據頁和索引頁加載到內存的緩沖池(buffer pool)中來提高讀寫速度。然后按照最近最少使用原則來保留緩沖池中的緩存數據。

那么當要讀入的數據頁不在內存中時,就需要到緩沖池中申請一個數據頁,但緩沖池中數據頁是一定的,當數據頁達到上限時此時就需要把最久不使用的數據頁從內存中淘汰掉。但如果淘汰的是臟頁呢,那么就需要把臟頁刷到磁盤里才能進行復用。

你看,又回到了刷臟頁的情況,讀操作時變慢你也能理解了吧?

防患于未然

知道了原因,我們如何來避免或緩解這種情況呢?

首先來看未命中索引的情況:

不知道大家有沒有使用 Mysql 中 explain 的習慣,反正我是每次都會用它來查看下當前 SQL 命中索引的情況。避免其帶來一些未知的隱患。

這里簡單介紹下其使用方式,通過在所執行的 SQL 前加上 explain 就可以來分析當前 SQL 的執行計劃:

執行后的結果對應的字段概要描述如下圖所示:

這里需要重點關注以下幾個字段:

1、type

表示 MySQL 在表中找到所需行的方式。其中常用的類型有:ALL、index、range、 ref、eq_ref、const、system、NULL 這些類型從左到右,性能逐漸變好。

  • ALL:Mysql 遍歷全表來找到匹配的行;

  • index:與 ALL 區別為 index 類型只遍歷索引樹;

  • range:只檢索給定范圍的行,使用一個索引來選擇行;

  • ref:表示上述表的連接匹配條件,哪些列或常量被用于查找索引列上的值;

  • eq_ref:類似ref,區別在于使用的是否為唯一索引。對于每個索引鍵值,表中只有一條記錄匹配,簡單來說,就是多表連接中使用 primary key 或者 unique key作為關聯條件;

  • const、system:當 Mysql 對查詢某部分進行優化,并轉換為一個常量時,使用這些類型訪問。如將主鍵置于 where 列表中,Mysql 就能將該查詢轉換為一個常量,system 是 const類型的特例,當查詢的表只有一行的情況下,使用system;

  • NULL:Mysql 在優化過程中分解語句,執行時甚至不用訪問表或索引,例如從一個索引列里選取最小值可以通過單獨索引查找完成。

2、possible_keys

查詢時可能使用到的索引(但不一定會被使用,沒有任何索引時顯示為 NULL)。

3、key

實際使用到的索引。

4、rows

估算查找到對應的記錄所需要的行數。

5、Extra

比較常見的是下面幾種:

  • Useing index:表明使用了覆蓋索引,無需進行回表;

  • Using where:不用讀取表中所有信息,僅通過索引就可以獲取所需數據,這發生在對表的全部的請求列都是同一個索引的部分的時候,表示mysql服務器將在存儲引擎檢索行后再進行過濾;

  • Using temporary:表示MySQL需要使用臨時表來存儲結果集,常見于排序和分組查詢,常見 group by,order by;

  • Using filesort:當Query中包含 order by 操作,而且無法利用索引完成的排序操作稱為“文件排序”。

對于刷臟頁的情況,我們需要控制臟頁的比例,不要讓它經常接近 75%。同時還要控制 redo log 的寫盤速度,并且通過設置 innodb_io_capacity 參數告訴 InnoDB 你的磁盤能力。

面試資料整理匯總

成功從小公司跳槽進螞蟻定級P7,只因刷了七遍這些面試真題

成功從小公司跳槽進螞蟻定級P7,只因刷了七遍這些面試真題

這些面試題是我朋友進阿里前狂刷七遍以上的面試資料,由于面試文檔很多,內容更多,沒有辦法一一為大家展示出來,所以只好為大家節選出來了一部分供大家參考,需要全部文檔的,關注小編后,點擊這里即可免費領取。

面試的本質不是考試,而是告訴面試官你會做什么,所以,這些面試資料中提到的技術也是要學會的,不然稍微改動一下你就涼涼了

一一為大家展示出來,所以只好為大家節選出來了一部分供大家參考,需要全部文檔的,關注小編后,點擊這里即可免費領取。

面試的本質不是考試,而是告訴面試官你會做什么,所以,這些面試資料中提到的技術也是要學會的,不然稍微改動一下你就涼涼了

在這里祝大家能夠拿到心儀的offer!

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

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

相關文章

String | 263. Ugly Number

題目:丑數 方法1 class Solution { public:bool isUgly ( int num ) {if (num 0)return false;while (num % 5 0)num / 5;while (num % 3 0)num / 3;while (num % 2 0)num / 2;return num 1;} };

萬字長文!java讀取json文件數據給對象

Java基礎核心筆記總結 由于篇幅限制,我就只以截圖展示目錄內容以及部分筆記內容,獲取完整版王者級核心寶典只需要點擊點贊關注即可獲取領取方式! 在這個部分我們總結了Java的基礎知識,涵蓋了:概述、開發環境、開發環境…

三年Java開發,java基礎常問面試題

一、首先本職工作一定要做好做精 本人之前在干兼職的時候,也忽視過本職工作,從而導致自己落后平均技術水平,雖然之后迎頭趕上,但這不能不算是個遺憾。前在接一些活的時候就感覺技術的重要性了,如果當年我技術再好些&a…

Array | 867. Transpose Matrix

題目&#xff1a;轉置矩陣 方法1&#xff1a; class Solution { public:vector<vector<int>> transpose(vector<vector<int>>& A) {vector<vector<int>> num(A[0].size(), vector<int>(A.size(), 0));for(int i 0; i < A.…

三年Java開發,尚學堂java馬士兵全套

基于 Servlet 容器的 Web MVC 身為 Java 開發者&#xff0c;對于 Spring 框架并不陌生。它起源于 2002 年、Rod Johnson 著作《Expert One-on-One J2EE Design and Development》中的 Interface 21 框架&#xff0c;到了 2004 年&#xff0c;推出 Spring 1.0&#xff0c;從 XM…

Array | 74. Search a 2D Matrix

題目&#xff1a;搜索二維矩陣 方法1&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if(!matrix.size())return false;if(!matrix[0].size())return false;for(int i 0; i < matrix[matrix.size() …

三年經驗java工資,含愛奇藝,小米,騰訊,阿里

1、PTP模型 Point-to-Point&#xff0c;點對點通信模型。PTP是基于隊列(Queue)的&#xff0c;一個隊列可以有多個生產者&#xff0c;和多個消費者。消息服務器按照收到消息的先后順序&#xff0c;將消息放到隊列中。隊列中的每一條消息&#xff0c;只能由一個消費者進行消費&a…

三面美團Java崗,java多線程匿名內部類

Part 1微服務架構設計概述 1.1 傳統應用架構的問題 1.2 微服務架構是什么 1.3 微服務架構有哪些特點和挑戰 1.4 如何搭建微服務架構 Part 2微服務開發框架 2.1 Spring Boot 是什么 2.2 如何使用Spring Boot框架 2.3 Spring Boot生產級特性 Part 3微服務網關 3.1 Node.js 是什…

函數signal

1. 函數signal #include <signal.h> void (*signal(int sig,void (*func)(int)))(int)typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 分析&#xff1a; signal參數信號名&#xff0c;func的值是SIG_ING、SIG_DFL或接到…

三面美團Java崗,java架構師線下培訓

性能優化專欄 1.Tomcat性能優化整理 2.JVM性能優化專題 3.Mysql性能優化整理 微服務架構面試專欄 1.SpringCloud面試整理 2.SpringBoot面試整理 3.Dubbo面試整理 并發編程高級面試專欄 開源框架面試題專欄 1.Spring面試整理 2.SpringMVC面試整理 3.MyBatis面試整理 分布式面…

信號 09 | SIGCLD語義

1. SIGCLD信號 SIG_DFL &#xff1a;默認的處理方式是不理會這個信號&#xff0c;但是也不會丟棄子進程狀態&#xff0c;所以如果不用wait&#xff0c;waitpid對其子進行進行狀態信息回收&#xff0c;會產生僵尸進程。SIG_IGN &#xff1a;忽略的處理方式&#xff0c;這個方式…

三面美團Java崗,java電子書下載百度云

Spring 全家桶&#xff1a; Spring 原理Spring面試題思維導圖面試題Spring視頻 Spring 原理 Spring特點Spring 核心組件Spring常用模塊Spring主要包Spring常用注解Sping第三方結合Spring 10C原理Spring APO原理Spring MVC原理Spring Boot原理JPA原理Mybatis緩存Tomcat架構 Sp…

【信號】函數kill、raise、abort、alarm

一、函數kill 1. kill函數原型&#xff1a; int kill(pid_t pid, int signo); //signo:信號名分析&#xff1a; pid > 0&#xff1a; 發送信號給指定的進程pid 0&#xff1a; 發送信號給調用kill函數進程屬于同一個進程組的所有進程pid < 0&#xff1a;信號signo將…

三面美團Java崗,尚學堂java馬士兵全套

SpringBoot經典之作 進入Spring Boot世界 準備開發環境搭建開發工具 基礎 Spring Boot基礎分層開發Web應用程序響應式編程 進階 Spring Boot進階用ORM操作SQL數據庫接口架構風格——RESTful集成安全框架&#xff0c;實現安全認證和授權集成Redis&#xff0c;實現高并發集成R…

信號 09 | 信號概念

信號的概念 信號在我們的生活隨處可見&#xff0c;如&#xff1a;古代戰爭中摔杯為號&#xff1b;代戰爭中的信號彈&#xff1b;體育比賽中使用的信號槍&#xff0c;它們都有共性&#xff1a;1. 簡單 2. 不能攜帶大量的信息 3. 滿足某個特定條件才發送 信號是信息的載體&…

一招徹底幫你搞定HashMap源碼,項目實戰

ES 集群架構演進之路 1、初始階段 訂單中心ES初始階段如一張白紙&#xff0c;架設方案基本沒有&#xff0c;很多配置都是保持集群默認配置。整個集群部署在集團的彈性云上&#xff0c;ES集群的節點以及機器部署都比較混亂。同時按照集群維度來看&#xff0c;一個ES集群會有單…

【信號】信號集、sigprocmask、sigpending

一、信號集操作函數 內核通過讀取未決信號集來判斷信號是否應被處理。信號屏蔽字mask可以影響未決信號集。而我們可以在用程序自定義set來改變mask&#xff0c;來達到屏蔽指定信號目的。 sigset_t set; // typedef unsigned long sig…

一招讓你拿下seata分布式事務框架,看這篇文章準沒錯!

第一階段&#xff1a;架構師筑基必備技能 我覺得&#xff0c;但凡是個成年人應該都清楚扎實的基本功對自己的工作幫助有多重要。從各大招聘網站的招聘要求來看&#xff0c;第一條都明確說明需要扎實的Java基礎。因此&#xff0c;一般筆試以及面試的第一輪&#xff0c;對基礎的…

函數signal、sigaction

二、函數sigaction 修改信號處理動作(通常在Linux用來注冊一個信號的捕捉函數) #inlcude<signal.h> int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); 參數&#xff1a; act&am…

一文了解OOM及解決方案,你還看不明白?

InnoDB總體結構 首先我們來看官網的一張圖(圖片來源于MySQL官網)&#xff1a; 從上圖中可以看出其主要分為兩部分結構&#xff0c;一部分為內存中的結構(上圖左邊)&#xff0c;一部分為磁盤中的結構(上圖右邊) 內存結構 InnoDB內存中的結構主要分為&#xff1a;Buffer Pool,…