主頁 >  其他 > 她問我:為什么 MySQL 喜歡 B+ 樹?我笑著畫了 20 張圖

她問我:為什么 MySQL 喜歡 B+ 樹?我笑著畫了 20 張圖

2021-12-19 08:46:45 其他

「為什么 MySQL 采用 B+ 樹作為索引?」這句話,是不是在面試時經常出現,

要解釋這個問題,其實不單單要從資料結構的角度出發,還要考慮磁盤 I/O 操作次數,因為 MySQL 的資料是存盤在磁盤中的嘛,

這次,就跟大家一層一層的分析這個問題,圖中包含大量的動圖來幫助大家理解,相信看完你就拿捏這道題目了!

圖片

怎樣的索引的資料結構是好的?

MySQL 的資料是持久化的,意味著資料(索引+記錄)是保存到磁盤上的,因為這樣即使設備斷電了,資料也不會丟失,

磁盤是一個慢的離譜的存盤設備,有多離譜呢?

人家記憶體的訪問速度是納秒級別的,而磁盤訪問的速度是毫秒級別的,也就是說讀取同樣大小的資料,磁盤中讀取的速度比從記憶體中讀取的速度要慢上萬倍,甚至幾十萬倍,

磁盤讀寫的最小單位是扇區,扇區的大小只有 512B 大小,作業系統一次會讀寫多個扇區,所以作業系統的最小讀寫單位是塊(Block),Linux 中的塊大小為4KB,也就是一次磁盤 I/O 操作會直接讀寫 8 個扇區,

由于資料庫的索引是保存到磁盤上的,因此當我們通過索引查找某行資料的時候,就需要先從磁盤讀取索引到記憶體,再通過索引從磁盤中找到某行資料,然后讀入到記憶體,也就是說查詢程序中會發生多次磁盤 I/O,而磁盤 I/O 次數越多,所消耗的時間也就越大,

所以,我們希望索引的資料結構能在盡可能少的磁盤的 I/O 操作中完成查詢作業,因為磁盤 I/O 操作越少,所消耗的時間也就越小,

另外,MySQL 是支持范圍查找的,所以索引的資料結構不僅要能高效地查詢某一個記錄,而且也要能高效地執行范圍查找,

所以,要設計一個適合 MySQL 索引的資料結構,至少滿足以下要求:

  • 能在盡可能少的磁盤的 I/O 操作中完成查詢作業;

  • 要能高效地查詢某一個記錄,也要能高效地執行范圍查找;

分析完要求后,我們針對每一個資料結構分析一下,

什么是二分查找?

索引資料最好能按順序排列,這樣可以使用「二分查找法」高效定位資料,

假設我們現在用陣列來存盤索引,比如下面有一個排序的陣列,如果要從中找出數字 3,最簡單辦法就是從頭依次遍歷查詢,這種方法的時間復雜度是 O(n),查詢效率并不高,因為該陣列是有序的,所以我們可以采用二分查找法,比如下面這張采用二分法的查詢程序圖:

圖片

可以看到,二分查找法每次都把查詢的范圍減半,這樣時間復雜度就降到了 O(logn),但是每次查找都需要不斷計算中間位置,

什么是二分查找樹?

用陣列來實作線性排序的資料雖然簡單好用,但是插入新元素的時候性能太低,

因為插入一個元素,需要將這個元素之后的所有元素后移一位,如果這個操作發生在磁盤中呢?這必然是災難性的,因為磁盤的速度比記憶體慢幾十萬倍,所以我們不能用一種線性結構將磁盤排序,

其次,有序的陣列在使用二分查找的時候,每次查找都要不斷計算中間的位置,

那我們能不能設計一個非線形且天然適合二分查找的資料結構呢?

有的,請看下圖這個神奇的操作,找到所有二分查找中用到的所有中間節點,把他們用指標連起來,并將最中間的節點作為根節點,

圖片

怎么樣?是不是變成了二叉樹,不過它不是普通的二叉樹,它是一個二叉查找樹

二叉查找樹的特點是一個節點的左子樹的所有節點都小于這個節點,右子樹的所有節點都大于這個節點,這樣我們在查詢資料時,不需要計算中間節點的位置了,只需將查找的資料與節點的資料進行比較,

假設,我們查找索引值為 key 的節點:

  1. 如果 key 大于根節點,則在右子樹中進行查找;

  2. 如果 key 小于根節點,則在左子樹中進行查找;

  3. 如果 key 等于根節點,也就是找到了這個節點,回傳根節點即可,

二叉查找樹查找某個節點的動圖演示如下,比如要查找節點 3 :

圖片

另外,二叉查找樹解決了插入新節點的問題,因為二叉查找樹是一個跳躍結構,不必連續排列,這樣在插入的時候,新節點可以放在任何位置,不會像線性結構那樣插入一個元素,所有元素都需要向后排列,

下面是二叉查找樹插入某個節點的動圖演示:

圖片

因此,二叉查找樹解決了連續結構插入新元素開銷很大的問題,同時又保持著天然的二分結構,

那是不是二叉查找樹就可以作為索引的資料結構了呢?

不行不行,二叉查找樹存在一個極端情況,會導致它變成一個瘸子!

當每次插入的元素都是二叉查找樹中最大的元素,二叉查找樹就會退化成了一條鏈表,查找資料的時間復雜度變成了 O(n),如下動圖演示:

圖片

由于樹是存盤在磁盤中的,訪問每個節點,都對應一次磁盤 I/O 操作(假設一個節點的大小「小于」作業系統的最小讀寫單位塊的大小),也就是說樹的高度就等于每次查詢資料時磁盤 IO 操作的次數,所以樹的高度越高,就會影響查詢性能,

二叉查找樹由于存在退化成鏈表的可能性,會使得查詢操作的時間復雜度從 O(logn)降低為 O(n),

而且會隨著插入的元素越多,樹的高度也變高,意味著需要磁盤 IO 操作的次數就越多,這樣導致查詢性能嚴重下降,再加上不能范圍查詢,所以不適合作為資料庫的索引結構,

什么是自平衡二叉樹?

為了解決二叉查找樹會在極端情況下退化成鏈表的問題,后面就有人提出平衡二叉查找樹(AVL 樹)

主要是在二叉查找樹的基礎上增加了一些條件約束:每個節點的左子樹和右子樹的高度差不能超過 1,也就是說節點的左子樹和右子樹仍然為平衡二叉樹,這樣查詢操作的時間復雜度就會一直維持在 O(logn) ,

下圖是每次插入的元素都是平衡二叉查找樹中最大的元素,可以看到,它會維持自平衡:

圖片

除了平衡二叉查找樹,還有很多自平衡的二叉樹,比如紅黑樹,它也是通過一些約束條件來達到自平衡,不過紅黑樹的約束條件比較復雜,不是本篇的重點重點,大家可以看《資料結構》相關的書籍來了解紅黑樹的約束條件,

下面是紅黑樹插入節點的程序,這左旋右旋的操作,就是為了自平衡,

圖片

不管平衡二叉查找樹還是紅黑樹,都會隨著插入的元素增多,而導致樹的高度變高,這就意味著磁盤 I/O 操作次數多,會影響整體資料查詢的效率

比如,下面這個平衡二叉查找樹的高度為 5,那么在訪問最底部的節點時,就需要磁盤 5 次 I/O 操作,

圖片

根本原因是因為它們都是二叉樹,也就是每個節點只能保存 2 個子節點 ,如果我們把二叉樹改成 M 叉樹(M>2)呢?

比如,當 M=3 時,在同樣的節點個數情況下,三叉樹比二叉樹的樹高要矮,

圖片

因此,當樹的節點越多的時候,并且樹的分叉數 M 越大的時候,M 叉樹的高度會遠小于二叉樹的高度

什么是 B 樹

自平衡二叉樹雖然能保持查詢操作的時間復雜度在O(logn),但是因為它本質上是一個二叉樹,每個節點只能有 2 個子節點,那么當節點個數越多的時候,樹的高度也會相應變高,這樣就會增加磁盤的 I/O 次數,從而影響資料查詢的效率,

為了解決降低樹的高度的問題,后面就出來了 B 樹,它不再限制一個節點就只能有 2 個子節點,而是允許 M 個子節點 (M>2),從而降低樹的高度,

B 樹的每一個節點最多可以包括 M 個子節點,M 稱為 B 樹的階,所以 B 樹就是一個多叉樹,

假設 M = 3,那么就是一棵 3 階的 B 樹,特點就是每個節點最多有 2 個(M-1個)資料和最多有 3 個(M個)子節點,超過這些要求的話,就會分裂節點,比如下面的的動圖:

圖片

我們來看看一棵 3 階的 B 樹的查詢程序是怎樣的?

圖片

假設我們在上圖一棵 3 階的 B 樹中要查找的索引值是 9 的記錄那么步驟可以分為以下幾步:

  1. 與根節點的索引(4,8)進行比較,9 大于 8,那么往右邊的子節點走;

  2. 然后該子節點的索引為(10,12),因為 9 小于 10,所以會往該節點的左邊子節點走;

  3. 走到索引為9的節點,然后我們找到了索引值 9 的節點,

可以看到,一棵 3 階的 B 樹在查詢葉子節點中的資料時,由于樹的高度是 3 ,所以在查詢程序中會發生 3 次磁盤 I/O 操作,

而如果同樣的節點數量在平衡二叉樹的場景下,樹的高度就會很高,意味著磁盤 I/O 操作會更多,所以,B 樹在資料查詢中比平衡二叉樹效率要高,

但是 B 樹的每個節點都包含資料(索引+記錄),而用戶的記錄資料的大小很有可能遠遠超過了索引資料,這就需要花費更多的磁盤 I/O 操作次數來讀到「有用的索引資料」,

而且,在我們查詢位于底層的某個節點(比如 A 記錄)程序中,「非 A 記錄節點」里的記錄資料會從磁盤加載到記憶體,但是這些記錄資料是沒用的,我們只是想讀取這些節點的索引資料來做比較查詢,而「非 A 記錄節點」里的記錄資料對我們是沒用的,這樣不僅增多磁盤 I/O 操作次數,也占用記憶體資源,

另外,如果使用 B 樹來做范圍查詢的話,需要使用中序遍歷,這會涉及多個節點的磁盤 I/O 問題,從而導致整體速度下降,

什么是 B+ 樹?

B+ 樹就是對 B 樹做了一個升級,MySQL 中索引的資料結構就是采用了 B+ 樹,B+ 樹結構如下圖:

圖片

B+ 樹與 B 樹差異的點,主要是以下這幾點:

  • 葉子節點(最底部的節點)才會存放實際資料(索引+記錄),非葉子節點只會存放索引;

  • 所有索引都會在葉子節點出現,葉子節點之間構成一個有序鏈表;

  • 非葉子節點的索引也會同時存在在子節點中,并且是在子節點中所有索引的最大(或最小),

  • 非葉子節點中有多少個子節點,就有多少個索引;

下面通過三個方面,比較下 B+ 和 B 樹的性能區別,

1、單點查詢

B 樹進行單個索引查詢時,最快可以在 O(1) 的時間代價內就查到,而從平均時間代價來看,會比 B+ 樹稍快一些,

但是 B 樹的查詢波動會比較大,因為每個節點即存索引又存記錄,所以有時候訪問到了非葉子節點就可以找到索引,而有時需要訪問到葉子節點才能找到索引,

B+ 樹的非葉子節點不存放實際的記錄資料,僅存放索引,因此資料量相同的情況下,相比存盤即存索引又存記錄的 B 樹,B+樹的非葉子節點可以存放更多的索引,因此 B+ 樹可以比 B 樹更「矮胖」,查詢底層節點的磁盤 I/O次數會更少

2、插入和洗掉效率

B+ 樹有大量的冗余節點,這樣使得洗掉一個節點的時候,可以直接從葉子節點中洗掉,甚至可以不動非葉子節點,這樣洗掉非常快,

比如下面這個動圖是洗掉 B+ 樹某個葉子節點節點的程序:

圖片

注意,:B+ 樹對于非葉子節點的子節點和索引的個數,定義方式可能會有不同,有的是說非葉子節點的子節點的個數為 M 階,而索引的個數為 M-1(這個是維基百科里的定義),因此我本文關于 B+ 樹的動圖都是基于這個,但是我在前面介紹 B+ 樹與 B+ 樹的差異時,說的是「非葉子節點中有多少個子節點,就有多少個索引」,主要是 MySQL 用到的 B+ 樹就是這個特性,

甚至,B+ 樹在洗掉根節點的時候,由于存在冗余的節點,所以不會發生復雜的樹的變形,比如下面這個動圖是洗掉 B+ 樹根節點的程序:

圖片

B 樹則不同,B 樹沒有冗余節點,洗掉節點的時候非常復雜,比如洗掉根節點中的資料,可能涉及復雜的樹的變形,比如下面這個動圖是洗掉 B 樹根節點的程序:

圖片

B+ 樹的插入也是一樣,有冗余節點,插入可能存在節點的分裂(如果節點飽和),但是最多只涉及樹的一條路徑,而且 B+ 樹會自動平衡,不需要像更多復雜的演算法,類似紅黑樹的旋轉操作等,

因此,B+ 樹的插入和洗掉效率更高

3、范圍查詢

B 樹和 B+ 樹等值查詢原理基本一致,先從根節點查找,然后對比目標資料的范圍,最后遞回的進入子節點查找,

因為 B+ 樹所有葉子節點間還有一個鏈表進行連接,這種設計對范圍查找非常有幫助,比如說我們想知道 12 月 1 日和 12 月 12 日之間的訂單,這個時候可以先查找到 12 月 1 日所在的葉子節點,然后利用鏈表向右遍歷,直到找到 12 月12 日的節點,這樣就不需要從根節點查詢了,進一步節省查詢需要的時間,

而 B 樹沒有將所有葉子節點用鏈表串聯起來的結構,因此只能通過樹的遍歷來完成范圍查詢,這會涉及多個節點的磁盤 I/O 操作,范圍查詢效率不如 B+ 樹,

因此,存在大量范圍檢索的場景,適合使用 B+樹,比如資料庫,而對于大量的單個索引查詢的場景,可以考慮 B 樹,比如 nosql 的MongoDB,

MySQL 中的 B+ 樹

MySQL 的存盤方式根據存盤引擎的不同而不同,我們最常用的就是 Innodb 存盤引擎,它就是采用了 B+ 樹作為了索引的資料結構,

下圖就是 Innodb 里的 B+ 樹:

圖片

但是 Innodb 使用的 B+ 樹有一些特別的點,比如:

  • B+ 樹的葉子節點之間是用「雙向鏈表」進行連接,這樣的好處是既能向右遍歷,也能向左遍歷,

  • B+ 樹點節點內容是資料頁,資料頁里存放了用戶的記錄以及各種資訊,每個資料頁默認大小是 16 KB,

Innodb 根據索引型別不同,分為聚集和二級索引,他們區別在于,聚集索引的葉子節點存放的是實際資料,所有完整的用戶記錄都存放在聚集索引的葉子節點,而二級索引的葉子節點存放的是主鍵值,而不是實際資料,

因為表的資料都是存放在聚集索引的葉子節點里,所以 InnoDB 存盤引擎一定會為表創建一個聚集索引,且由于資料在物理上只會保存一份,所以聚簇索引只能有一個,而二級索引可以創建多個,

總結

MySQL 是會將資料持久化在硬碟,而存盤功能是由 MySQL 存盤引擎實作的,所以討論 MySQL 使用哪種資料結構作為索引,實際上是在討論存盤引使用哪種資料結構作為索引,InnoDB 是 MySQL 默認的存盤引擎,它就是采用了 B+ 樹作為索引的資料結構,

要設計一個 MySQL 的索引資料結構,不僅僅考慮資料結構增刪改的時間復雜度,更重要的是要考慮磁盤 I/0 的操作次數,因為索引和記錄都是存放在硬碟,硬碟是一個非常慢的存盤設備,我們在查詢資料的時候,最好能在盡可能少的磁盤 I/0 的操作次數內完成,

二分查找樹雖然是一個天然的二分結構,能很好的利用二分查找快速定位資料,但是它存在一種極端的情況,每當插入的元素都是樹內最大的元素,就會導致二分查找樹退化成一個鏈表,此時查詢復雜度就會從 O(logn)降低為 O(n),

為了解決二分查找樹退化成鏈表的問題,就出現了自平衡二叉樹,保證了查詢操作的時間復雜度就會一直維持在 O(logn) ,但是它本質上還是一個二叉樹,每個節點只能有 2 個子節點,隨著元素的增多,樹的高度會越來越高,

而樹的高度決定于磁盤 I/O 操作的次數,因為樹是存盤在磁盤中的,訪問每個節點,都對應一次磁盤 I/O 操作,也就是說樹的高度就等于每次查詢資料時磁盤 IO 操作的次數,所以樹的高度越高,就會影響查詢性能,

B 樹和 B+ 都是通過多叉樹的方式,會將樹的高度變矮,所以這兩個資料結構非常適合檢索存于磁盤中的資料,

但是 MySQL 默認的存盤引擎 InnoDB 采用的是 B+ 作為索引的資料結構,原因有:

  • B+ 樹的非葉子節點不存放實際的記錄資料,僅存放索引,因此資料量相同的情況下,相比存盤即存索引又存記錄的 B 樹,B+樹的非葉子節點可以存放更多的索引,因此 B+ 樹可以比 B 樹更「矮胖」,查詢底層節點的磁盤 I/O次數會更少,

  • B+ 樹有大量的冗余節點(所有非葉子節點都是冗余索引),這些冗余索引讓 B+ 樹在插入、洗掉的效率都更高,比如洗掉根節點的時候,不會像 B 樹那樣會發生復雜的樹的變化;

  • B+ 樹葉子節點之間用鏈表連接了起來,有利于范圍查詢,而 B 樹要實作范圍查詢,因此只能通過樹的遍歷來完成范圍查詢,這會涉及多個節點的磁盤 I/O 操作,范圍查詢效率不如 B+ 樹,

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

標籤:其他

上一篇:為了不被裁,33歲大廠高齡員工有多拼:晚上十點下班,繼續學習到凌晨

下一篇:程式員跳槽國企每周作業5小時,看到薪資后,網友說幸運至極

標籤雲
其他(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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more