主頁 > 資料庫 > 詳解一條 SQL 的執行程序

詳解一條 SQL 的執行程序

2021-01-26 07:16:34 資料庫

以下文章來源于碼海 ,作者碼海

詳解一條 SQL 的執行程序

天天和資料庫打交道,一天能寫上幾十條 SQL 陳述句,但你知道我們的系統是如何和資料庫互動的嗎?MySQL 如何幫我們存盤資料、又是如何幫我們管理事務?....是不是感覺真的除了寫幾個 「select * from dual」外基本腦子一片空白?這篇文章就將帶你走進 MySQL 的世界,讓你徹底了解系統到底是如何和 MySQL 互動的,MySQL 在接受到我們發送的 SQL 陳述句時又分別做了哪些事情,

MySQL 驅動

 

我們的系統在和 MySQL 資料庫進行通信的時候,總不可能是平白無故的就能接收和發送請求,就算是你沒有做什么操作,那總該是有其他的“人”幫我們做了一些事情,基本上使用過 MySQL 資料庫的程式員多多少少都會知道 MySQL 驅動這個概念的,就是這個 MySQL  驅動在底層幫我們做了對資料庫的連接,只有建立了連接了,才能夠有后面的互動,看下圖表示

 

 

這樣的話,在系統和 MySQL 進行互動之前,MySQL 驅動會幫我們建立好連接,然后我們只需要發送 SQL 陳述句就可以執行 CRUD 了,一次 SQL 請求就會建立一個連接,多個請求就會建立多個連接,那么問題來了,我們系統肯定不是一個人在使用的,換句話說肯定是存在多個請求同時去爭搶連接的情況,我們的 web 系統一般都是部署在 tomcat 容器中的,而  tomcat  是可以并發處理多個請求的,這就會導致多個請求會去建立多個連接,然后使用完再都去關閉,這樣會有什么問題呢?如下圖

 

 

java 系統在通過 MySQL 驅動和 MySQL 資料庫連接的時候是基于 TCP/IP 協議的,所以如果每個請求都是新建連接和銷毀連接,那這樣勢必會造成不必要的浪費和性能的下降,也就說上面的多執行緒請求的時候頻繁的創建和銷毀連接顯然是不合理的,必然會大大降低我們系統的性能,但是如果給你提供一些固定的用來連接的執行緒,這樣是不是不需要反復的創建和銷毀連接了呢?相信懂行的朋友會會心一笑,沒錯,說的就是資料庫連接池,

資料庫連接池:維護一定的連接數,方便系統獲取連接,使用就去池子中獲取,用完放回去就可以了,我們不需要關心連接的創建與銷毀,也不需要關心執行緒池是怎么去維護這些連接的,

 

 

常見的資料庫連接池有 Druid、C3P0、DBCP,連接池實作原理在這里就不深入討論了,采用連接池大大節省了不斷創建與銷毀執行緒的開銷,這就是有名的「池化」思想,不管是執行緒池還是 HTTP 連接池,都能看到它的身影,

 

資料庫連接池

 

到這里,我們已經知道的是我們的系統在訪問  MySQL  資料庫的時候,建立的連接并不是每次請求都會去創建的,而是從資料庫連接池中去獲取,這樣就解決了因為反復的創建和銷毀連接而帶來的性能損耗問題了,不過這里有個小問題,業務系統是并發的,而 MySQL 接受請求的執行緒呢,只有一個?

其實 MySQL 的架構體系中也已經提供了這樣的一個池子,也是資料庫連池,雙方都是通過資料庫連接池來管理各個連接的,這樣一方面執行緒之前不需要是爭搶連接,更重要的是不需要反復的創建的銷毀連接,

 

 至此系統和 MySQL 資料庫之間的連接問題已經說明清楚了,那么 MySQL 資料庫中的這些連接是怎么來處理的,又是誰來處理呢?

網路連接必須由執行緒來處理

對計算基礎稍微有一點了解的的同學都是知道的,網路中的連接都是由執行緒來處理的,所謂網路連接說白了就是一次請求,每次請求都會有相應的執行緒去處理的,也就是說對于 SQL 陳述句的請求在 MySQL  中是由一個個的執行緒去處理的,

 

 那這些執行緒會怎么去處理這些請求?會做哪些事情?

 

SQL 介面

MySQL 中處理請求的執行緒在獲取到請求以后獲取 SQL 陳述句去交給 SQL 介面去處理,

 

查詢決議器

 

假如現在有這樣的一個 SQL

SELECT stuName,age,sex FROM students WHERE id=1

但是這個 SQL 是寫給我們人看的,機器哪里知道你在說什么?這個時候決議器就上場了,他會將  SQL  介面傳遞過來的 SQL 陳述句進行決議,翻譯成 MySQL 自己能認識的語言,至于怎么決議的就不需要在深究了,無非是自己一套相關的規則,

 

 

 

現在 SQL 已經被決議成  MySQL  認識的樣子的,那下一步是不是就是執行嗎?理論上是這樣子的,但是 MySQL 的強大遠不止于此,他還會幫我們選擇最優的查詢路徑,

什么叫最優查詢路徑?就是 MySQL 會按照自己認為的效率最高的方式去執行查詢

具體是怎么做到的呢?這就要說到  MySQL  的查詢優化器了

MySQL 查詢優化器

MySQL 查詢優化器

查詢優化器內部具體怎么實作的我們不需要是關心,我需要知道的是  MySQL  會幫我去使用他自己認為的最好的方式去優化這條  SQL  陳述句,并生成一條條的執行計劃,比如你創建了多個索引,MySQL 會依據成本最小原則來選擇使用對應的索引,這里的成本主要包括兩個方面, IO 成本和 CPU 成本

IO 成本: 即從磁盤把資料加載到記憶體的成本,默認情況下,讀取資料頁的 IO 成本是 1,MySQL 是以頁的形式讀取資料的,即當用到某個資料時,并不會只讀取這個資料,而會把這個資料相鄰的資料也一起讀到記憶體中,這就是有名的程式區域性原理,所以 MySQL 每次會讀取一整頁,一頁的成本就是 1,所以 IO 的成本主要和頁的大小有關

CPU 成本:將資料讀入記憶體后,還要檢測資料是否滿足條件和排序等 CPU 操作的成本,顯然它與行數有關,默認情況下,檢測記錄的成本是 0.2,

MySQL 優化器 會計算 「IO 成本 + CPU」 成本最小的那個索引來執行

畫外音:索引成本具體怎么計算,請參考?這篇文章

 

 優化器執行選出最優索引等步驟后,會去呼叫存盤引擎介面,開始去執行被  MySQL  決議過和優化過的 SQL 陳述句

存盤引擎

查詢優化器會呼叫存盤引擎的介面,去執行  SQL,也就是說真正執行  SQL  的動作是在存盤引擎中完成的,資料是被存放在記憶體或者是磁盤中的(存盤引擎是一個非常重要的組件,后面會詳細介紹)

本篇文章大家先對存盤引擎有一個大致的認識就可以了,后續專門文章來詳細介紹的,

執行器

執行器是一個非常重要的組件,因為前面那些組件的操作最終必須通過執行器去呼叫存盤引擎介面才能被執行,執行器最終最根據一系列的執行計劃去呼叫存盤引擎的介面去完成  SQL  的執行

 

 

初識存盤引擎

我們以一個更新的SQL陳述句來說明,SQL 如下

UPDATE students SET stuName = '小強' WHERE id = 1

當我們系統發出這樣的查詢去交給 MySQL 的時候,MySQL 會按照我們上面介紹的一系列的流程最終通過執行器呼叫存盤引擎去執行,流程圖就是上面那個,在執行這個 SQL 的時候 SQL 陳述句對應的資料要么是在記憶體中,要么是在磁盤中,如果直接在磁盤中操作,那這樣的隨機IO讀寫的速度肯定讓人無法接受的,所以每次在執行 SQL 的時候都會將其資料加載到記憶體中,這塊記憶體就是 InnoDB 中一個非常重要的組件:緩沖池 Buffer Pool

Buffer Pool

Buffer Pool (緩沖池)是 InnoDB 存盤引擎中非常重要的記憶體結構,顧名思義,緩沖池其實就是類似  Redis  一樣的作用,起到一個快取的作用,因為我們都知道 MySQL 的資料最終是存盤在磁盤中的,如果沒有這個 Buffer Pool  那么我們每次的資料庫請求都會磁盤中查找,這樣必然會存在 IO 操作,這肯定是無法接受的,但是有了 Buffer Pool 就是我們第一次在查詢的時候會將查詢的結果存到  Buffer Pool 中,這樣后面再有請求的時候就會先從緩沖池中去查詢,如果沒有再去磁盤中查找,然后在放到  Buffer Pool 中,如下圖

 

 

按照上面的那幅圖,這條 SQL 陳述句的執行步驟大致是這樣子的

  1. innodb 存盤引擎會在緩沖池中查找 id=1 的這條資料是否存在
  2. 發現不存在,那么就會去磁盤中加載,并將其存放在緩沖池中
  3. 該條記錄會被加上一個獨占鎖(總不能你在修改的時候別人也在修改吧,這個機制本篇文章不重點介紹,以后會專門寫文章來詳細講解)
undo 日志檔案

undo 日志檔案:記錄資料被修改前的樣子

undo 顧名思義,就是沒有做,沒發生的意思,undo log  就是沒有發生事情(原本事情是什么)的一些日志

我們剛剛已經說了,在準備更新一條陳述句的時候,該條陳述句已經被加載到 Buffer pool 中了,實際上這里還有這樣的操作,就是在將該條陳述句加載到 Buffer Pool 中的時候同時會往 undo 日志檔案中插入一條日志,也就是將 id=1 的這條記錄的原來的值記錄下來,

這樣做的目的是什么?

Innodb 存盤引擎的最大特點就是支持事務,如果本次更新失敗,也就是事務提交失敗,那么該事務中的所有的操作都必須回滾到執行前的樣子,也就是說當事務失敗的時候,也不會對原始資料有影響,看圖說話

 

 

這里說句額外話,其實 MySQL  也是一個系統,就好比我們平時開發的 java 的功能系統一樣,MySQL  使用的是自己相應的語言開發出來的一套系統而已,它根據自己需要的功能去設計對應的功能,它即然能做到哪些事情,那么必然是設計者們當初這么定義或者是根據實際的場景變更演化而來的,所以大家放平心態,把 MySQL 當作一個系統去了解熟悉他,

到這一步,我們的執行的 SQL 陳述句已經被加載到 Buffer Pool 中了,然后開始更新這條陳述句,更新的操作實際是在Buffer Pool中執行的,那問題來了,按照我們平時開發的一套理論緩沖池中的資料和資料庫中的資料不一致時候,我們就認為快取中的資料是臟資料,那此時 Buffer Pool 中的資料豈不是成了臟資料?沒錯,目前這條資料就是臟資料,Buffer Pool 中的記錄是小強 資料庫中的記錄是旺財 ,這種情況 MySQL是怎么處理的呢,繼續往下看

redo 日志檔案:記錄資料被修改后的樣子

redo 日志檔案:記錄資料被修改后的樣子

除了從磁盤中加載檔案和將操作前的記錄保存到 undo 日志檔案中,其他的操作是在記憶體中完成的,記憶體中的資料的特點就是:斷電丟失,如果此時 MySQL 所在的服務器宕機了,那么 Buffer Pool 中的資料會全部丟失的,這個時候 redo 日志檔案就需要來大顯神通了

畫外音:redo 日志檔案是 InnoDB 特有的,他是存盤引擎級別的,不是 MySQL 級別的

redo 記錄的是資料修改之后的值,不管事務是否提交都會記錄下來,例如,此時將要做的是update students set stuName='小強' where id=1; 那么這條操作就會被記錄到 redo log buffer 中,啥?怎么又出來一個 redo log buffer ,很簡單,MySQL 為了提高效率,所以將這些操作都先放在記憶體中去完成,然后會在某個時機將其持久化到磁盤中,

 

 

截至目前,我們應該都熟悉了 MySQL 的執行器呼叫存盤引擎是怎么將一條 SQL 加載到緩沖池和記錄哪些日志的,流程如下:

  1. 準備更新一條 SQL 陳述句
  2. MySQL(innodb)會先去緩沖池(BufferPool)中去查找這條資料,沒找到就會去磁盤中查找,如果查找到就會將這條資料加載到緩沖池(BufferPool)中
  3. 在加載到 Buffer Pool 的同時,會將這條資料的原始記錄保存到 undo 日志檔案中
  4. innodb 會在 Buffer Pool 中執行更新操作
  5. 更新后的資料會記錄在 redo log buffer 中

上面說的步驟都是在正常情況下的操作,但是程式的設計和優化并不僅是為了這些正常情況而去做的,也是為了那些臨界區和極端情況下出現的問題去優化設計的

這個時候如果服務器宕機了,那么快取中的資料還是丟失了,真煩,竟然資料總是丟失,那能不能不要放在記憶體中,直接保存到磁盤呢?很顯然不行,因為在上面也已經介紹了,在記憶體中的操作目的是為了提高效率,

此時,如果 MySQL 真的宕機了,那么沒關系的,因為 MySQL 會認為本次事務是失敗的,所以資料依舊是更新前的樣子,并不會有任何的影響,

好了,陳述句也更新好了那么需要將更新的值提交啊,也就是需要提交本次的事務了,因為只要事務成功提交了,才會將最后的變更保存到資料庫,在提交事務前仍然會具有相關的其他操作

將  redo Log Buffer 中的資料持久化到磁盤中,就是將 redo log buffer 中的資料寫入到 redo log 磁盤檔案中,一般情況下,redo log Buffer 資料寫入磁盤的策略是立即刷入磁盤(具體策略情況在下面小總結出會詳細介紹),上圖

 

 

如果 redo log Buffer 刷入磁盤后,資料庫服務器宕機了,那我們更新的資料怎么辦?此時資料是在記憶體中,資料豈不是丟失了?不,這次資料就不會丟失了,因為 redo log buffer 中的資料已經被寫入到磁盤了,已經被持久化了,就算資料庫宕機了,在下次重啟的時候 MySQL 也會將 redo 日志檔案內容恢復到 Buffer Pool 中(這邊我的理解是和  Redis  的持久化機制是差不多的,在  Redis  啟動的時候會檢查 rdb 或者是 aof 或者是兩者都檢查,根據持久化的檔案來將資料恢復到記憶體中)

到此為止,從執行器開始呼叫存盤引擎介面做了哪些事情呢?

1.準備更新一條 SQL 陳述句

2.MySQL(innodb)會先去緩沖池(BufferPool)中去查找這條資料,沒找到就會去磁盤中查找,如果查找到就會將這條資料加載

到緩沖池(BufferPool)中 3.在加載到 Buffer Pool 的同時,會將這條資料的原始記錄保存到 undo 日志檔案中

4.innodb 會在 Buffer Pool 中執行更新操作

5.更新后的資料會記錄在 redo log buffer 中

---到此是前面已經總結過的---

6.MySQL 提交事務的時候,會將 redo log buffer 中的資料寫入到 redo 日志檔案中 刷磁盤可以通過 innodb_flush_log_at_trx_commit 引數來設定

值為 0 表示不刷入磁盤

值為 1 表示立即刷入磁盤

值為 2 表示先刷到 os cache

7.myslq 重啟的時候會將 redo 日志恢復到緩沖池中

截止到目前位置,MySQL  的執行器呼叫存盤引擎的介面去執行【執行計劃】提供的 SQL 的時候 InnoDB 做了哪些事情也就基本差不多了,但是這還沒完,下面還需要介紹下 MySQL 級別的日志檔案 bin log

bin log 日志檔案:記錄整個操作程序

上面介紹到的redo log是  InnoDB  存盤引擎特有的日志檔案,而bin log屬于是  MySQL  級別的日志,redo log記錄的東西是偏向于物理性質的,如:“對什么資料,做了什么修改”,bin log是偏向于邏輯性質的,類似于:“對 students 表中的 id 為 1 的記錄做了更新操作” 兩者的主要特點總結如下:

性質redo Logbin Log
檔案大小 redo log 的大小是固定的(配置中也可以設定,一般默認的就足夠了) bin log 可通過配置引數max_bin log_size設定每個bin log檔案的大小(但是一般不建議修改),
實作方式 redo logInnoDB引擎層實作的(也就是說是 Innodb  存盤引起過獨有的) bin log是  MySQL  層實作的,所有引擎都可以使用 bin log日志
記錄方式 redo log 采用回圈寫的方式記錄,當寫到結尾時,會回到開頭回圈寫日志, bin log 通過追加的方式記錄,當檔案大小大于給定值后,后續的日志會記錄到新的檔案上
使用場景 redo log適用于崩潰恢復(crash-safe)(這一點其實非常類似與 Redis 的持久化特征) bin log 適用于主從復制和資料恢復

bin log檔案是如何刷入磁盤的?

bin log 的刷盤是有相關的策略的,策略可以通過sync_bin log來修改,默認為 0,表示先寫入 os cache,也就是說在提交事務的時候,資料不會直接到磁盤中,這樣如果宕機bin log資料仍然會丟失,所以建議將sync_bin log設定為 1 表示直接將資料寫入到磁盤檔案中,

刷入 bin log 有以下幾種模式

1、 STATMENT

基于 SQL 陳述句的復制(statement-based replication, SBR),每一潭訓修改資料的 SQL 陳述句會記錄到 bin log 中

【優點】:不需要記錄每一行的變化,減少了 bin log 日志量,節約了 IO , 從而提高了性能

【缺點】:在某些情況下會導致主從資料不一致,比如執行sysdate()、slepp()等

2、ROW

基于行的復制(row-based replication, RBR),不記錄每條SQL陳述句的背景關系資訊,僅需記錄哪條資料被修改了

【優點】:不會出現某些特定情況下的存盤程序、或 function、或 trigger 的呼叫和觸發無法被正確復制的問題

【缺點】:會產生大量的日志,尤其是 alter table 的時候會讓日志暴漲

3、MIXED

基于 STATMENT 和 ROW 兩種模式的混合復制( mixed-based replication, MBR ),一般的復制使用 STATEMENT 模式保存 bin log ,對于 STATEMENT 模式無法復制的操作使用 ROW 模式保存 bin log

那既然bin log也是日志檔案,那它是在什么記錄資料的呢?

其實 MySQL 在提交事務的時候,不僅僅會將 redo log buffer  中的資料寫入到redo log 檔案中,同時也會將本次修改的資料記錄到 bin log檔案中,同時會將本次修改的bin log檔案名和修改的內容在bin log中的位置記錄到redo log中,最后還會在redo log最后寫入 commit 標記,這樣就表示本次事務被成功的提交了,

 

 

如果在資料被寫入到bin log檔案的時候,剛寫完,資料庫宕機了,資料會丟失嗎?

首先可以確定的是,只要redo log最后沒有 commit 標記,說明本次的事務一定是失敗的,但是資料是沒有丟失了,因為已經被記錄到redo log的磁盤檔案中了,在 MySQL 重啟的時候,就會將 redo log 中的資料恢復(加載)到Buffer Pool中,

好了,到目前為止,一個更新操作我們基本介紹得差不多,但是你有沒有感覺少了哪件事情還沒有做?是不是你也發現這個時候被更新記錄僅僅是在記憶體中執行的,哪怕是宕機又恢復了也僅僅是將更新后的記錄加載到Buffer Pool中,這個時候 MySQL 資料庫中的這條記錄依舊是舊值,也就是說記憶體中的資料在我們看來依舊是臟資料,那這個時候怎么辦呢?

其實 MySQL 會有一個后臺執行緒,它會在某個時機將我們Buffer Pool中的臟資料刷到 MySQL 資料庫中,這樣就將記憶體和資料庫的資料保持統一了,

 

 

 

本文總結

到此,關于Buffer Pool、Redo Log Buffer 和undo log、redo log、bin log 概念以及關系就基本差不多了,

我們再回顧下 

  1. Buffer Pool 是 MySQL 的一個非常重要的組件,因為針對資料庫的增刪改操作都是在 Buffer Pool 中完成的

  2. Undo log 記錄的是資料操作前的樣子

  3. redo log 記錄的是資料被操作后的樣子(redo log 是 Innodb 存盤引擎特有)

  4. bin log 記錄的是整個操作記錄(這個對于主從復制具有非常重要的意義)

從準備更新一條資料到事務的提交的流程描述

  1. 首先執行器根據 MySQL 的執行計劃來查詢資料,先是從快取池中查詢資料,如果沒有就會去資料庫中查詢,如果查詢到了就將其放到快取池中

  2. 在資料被快取到快取池的同時,會寫入 undo log 日志檔案

  3. 更新的動作是在 BufferPool 中完成的,同時會將更新后的資料添加到 redo log buffer 中

  4. 完成以后就可以提交事務,在提交的同時會做以下三件事

  5. (第一件事)將redo log buffer中的資料刷入到 redo log 檔案中

  6. (第二件事)將本次操作記錄寫入到 bin log檔案中

  7. (第三件事)將 bin log 檔案名字和更新內容在 bin log 中的位置記錄到redo log中,同時在 redo log 最后添加 commit 標記

至此表示整個更新事務已經完成

結束語

到此為止,系統是如何和 MySQL 資料庫打交道,提交一條更新的 SQL 陳述句到 MySQL,MySQL 執行了哪些流程,做了哪些事情從宏觀上都已經講解完成了,更多的 Buffer Pool 的細節將會在之后的文章中詳解

 

 

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/252563.html

標籤:其他

上一篇:騰訊云資料庫品牌升級,大咖解讀資料庫三大變化

下一篇:PostgreSQL忘記postgres賬號的密碼怎么辦?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more