主頁 >  其他 > 【MySQL】一文掌握索引事務的核心內容

【MySQL】一文掌握索引事務的核心內容

2021-12-30 09:52:41 其他

前言

本文介紹了MySQL的索引和事務,如果你恰好對這方面的知識不了解的話,那么來看看本文吧!!


一、索引

1.1 概念

索引是一種特殊的檔案,包含著對資料表里所有記錄的參考指標,可以對表中的一列或多列創建索引,并指定索引的型別,各類索引有各自的資料結構實作,(具體細節在后續的資料庫原理課程講解)

通俗的講:我們一本書,最開始有目錄,通過目錄可以看見相關的情況,比如可以看見有多少個章節,每個章節的大概內容,mysql 的索引也是差不多的,


1.2 索引的作用及核心思想

  • 資料庫中的表、資料、索引之間的關系,類似于書架上的圖書、書籍內容和書籍目錄的關系,
  • 索引所起的作用類似書籍目錄,可用于快速定位、檢索資料,
  • 索引對于提高資料庫的性能有很大的幫助,

那這個索引有什么用呢??

我們都知道mysql查找主要是select

select基本執行程序,遍歷表,依次取出每個記錄,根據where字句的條件,決定這個記錄要保留還是過濾,像這樣的遍歷操作,本身是比較低效的(尤其是資料量很大的時候)

為什么特別低效呢?因為把資料存盤在硬碟上的,取出每個記錄(這個操作都意味訪問硬碟) 相比之下,我們更希望訪問硬碟的次數盡量少,


怎么樣才可以更高效的訪問呢?如何提高查找速度,這里就要提到資料結構了,資料庫本質上也是基于資料結構來實作的,想要提高查找速度,就需要一些的資料結構來輔助:那么我們要來挑選一個

1.二叉搜索樹

二叉搜索樹,時間是O(N),因為要一個個遍歷,還是比較低效的,雖然說可以提高速度,但是具體提高多少還是要看那一顆樹了,也有可能是單支樹,為了進一步改進引入AVL樹

2.AVL樹

AVL本質上是一顆二叉平衡搜索樹,什么叫做平衡呢?
平衡:對于這個樹的任意節點來說,左子樹的高度減去右子樹的高度絕對值小于等于1
避免出現單支樹,保證了查找效率

但是這里會有新的問題出現: 如果這樣設定的話,意味著隨著插入/洗掉的元素的進行,這個AVL樹規則就可能被破壞掉,就隨時的調整樹的結構~,保證這個樹始終符合AVL樹的要求,
(調整操作就非常頻繁了,此時這個樹插入洗掉操作就低效了)

3 .紅黑樹

為什么進一步的改進AVL樹,讓查找,插入,洗掉能比較均衡又引入了紅黑樹,

本質上是一個放松規則的AVL樹,也要求讓這個二叉搜索樹平衡,但是沒有要求的那么嚴格,(這里的規則更寬松,從而就能保證觸發調整的情況沒有那么頻繁) ,雖然查找可能比AVL樹稍微遜色一點,但是差異不大,同時能夠保證插入和洗掉效率更高,在之間取得一個平衡的點,因為它的插入查找洗掉都是O(logN)

4.哈希表

哈希表相對于上面介紹的資料結構,還是要強一點的,它的插入查找洗掉時間復雜度,都是O(1),主要是借助了,陣列去下標的“隨機訪問能力”(非常高效),把保存的key轉換成陣列下標,保存到對應的位置上,下次查找也是先把key轉成下標,直接去下標就可以了~

  • 雖然說哈希表有哈希沖突問題但是我們也有解決辦法:
  • 1)掛鏈表的方式
  • 2)往后找一個空位的方式(線性探測 / 二次探測)

如果索引使用哈希表來做,可以行嗎?

 可行:確實可以提高查找速度
 不可行:其實還存在很大的局限性

為什么說不可行:

一個哈希表要想查詢,有一個關鍵的事情,必須要比較“相等”,哈希表的查詢時候,只能查某個key==具體值,這樣的情況~但是我們SQL中存在很多的查詢, 比如一些條件,正因如,我們在標準庫的HashMap的時候,要求key的型別,必須提供"比較相等(equals)”這樣的方法實作,

5.紅黑樹

紅黑樹就是普通二叉樹的升級版,其實也不太可行,紅黑樹查找效率直接就是由樹的高度決定的~(高度也就相當于比較次數),由于樹是二叉的,當元素增加很多之后,高度也會隨之增加不少,紅黑樹壞事就在于它是二叉樹,拋開二叉樹不說進行范圍比較還是可以的


其實,mysql的索引最常用的資料結構,其實就是一個N叉搜索樹!! 每一個有很多子節點,使用N叉的目的就是能減少高度~ 高度低了,此時查找時候的比較次數就少了,磁盤io也少了,效率就高了 ,

6.B樹

MySQL中的索引,其中最常用的結果是B+樹(B+樹就是一種特殊的N叉搜索樹)
要想理解b+樹,先了解B樹(B樹是B加樹的前身,B+樹就是改進版的B樹)
B樹也是一個N叉搜索樹~(B樹在有的資料叫做 B-樹,就是B樹,不叫B減樹

來大概看看B樹是什么樣的:

在這里插入圖片描述

B樹的特點:

  1. N叉搜索樹,每個節點可能會包含N個子樹
  2. 每個節點上存在多個值
  3. 保證類似“二叉搜索樹”一樣的規則(左子樹,小于根節點,小于右子樹

來一個流程:
例如:查找一個元素,22
先拿22去跟根節點比較,根節點之間,發現22比30小,于是從最左側第一個叉出來,繼續往下找
在這里插入圖片描述
在拿22去和15,20,25這個節點對比,我們就知道22在20 和25之間
在這里插入圖片描述
因此就從這個節點的第三個叉,繼續往下走,接下來拿22去和“21 ,22 ” 這個節點進行比較,查找和二叉搜索樹差不多,不過我們把高度變低了,B樹當我們的索引其實挺合適的,不過我們還可以改進空間,引入B+樹,

7.B+樹

B+樹做出的改變:這里大家看見看見重復了最后也是一個8,大家別急著說浪費空間,可能也是一個改進
在這里插入圖片描述
我們繼續完成這樹:下面使用鏈表連接

這個B+樹和B樹相比,最明顯的變化就是兩個方面:

  1. 非葉子節點的值,可能會存在重復的,就可以保證最終的葉子節點的一層,就是完整的資料集合~
  2. 通過類似于鏈表這樣的方式,把所有的葉子節點按照順序,連接起來~

B+樹的優勢:

  1. 非常擅長“范圍查找” 例如查一個ID<=11 and ID >=6

    我們拿著這兩個邊界值去,分別去找兩個邊界值的位置比如 6 9,然后遍歷鏈表比較方便 :

    那么我們和B樹相比,我們來看看B樹的弊端: 比如我們兩個數,我們不知道哪里是中間元素在這里插入圖片描述

  2. 所有的查詢最終都是落在葉子節點上,查詢速度是比較穩定的.

    比如B樹,我們找找40 45 一個40 一開始馬上找到,一個45還要遍歷就比40要慢,所以不太穩 定,我們B+樹的查詢還是比較穩定的,
    在這里插入圖片描述

  3. 由于葉子節點是資料的全集,因此可以把葉子節點存在硬碟上,非葉子節點直接存在記憶體中,又大大降低了讀取硬碟的次數嗎,怎么理解這個話呢?

我們要知道每一個節點不只就一個記錄,可能一行里面有許多資訊,如果像B樹那樣全部存在硬碟上,才存的下,相比B+樹,我們只在它的葉子節點存全部資訊,非葉子節點只存部分資訊,這個時候非葉子節點整體的空間就少了很多了,在記憶體也可以存下來,這個是B+樹的大殺器,我們把ID這樣的重要資訊存在記憶體,把全部資訊存在硬碟,這樣我們的重復還是很有必要的


1.3 使用場景

我們使用索引,最主要的還是來查詢,要考慮對資料庫表的某列或某幾列創建索引,需要考慮以下幾點:

  • 資料量較大,且經常對這些列進行條件查詢,
  • 該資料庫表的插入操作,及對這些列的修改操作頻率較低,
  • 索引會占用額外的磁盤空間
  1. 當然不是說我們什么時候都可以使用索引,新增洗掉修改多,查找比較少,索引就不太合適,但是這種 查多,修改少的場景我們也是非常常見的,因此索引的用處還是特別多的,像我們去一個論壇,我們大多數是在查看,而不是去進行修改 洗掉操作,
  2. 索引本身也是占劇一定空間的,如果磁盤空間充裕那還好,如果磁盤空間非常緊張,那就不太適合使用索引了,
  3. 建立索引,是指定某個列來建立的,就是要求這個索引列,得是“區分度比較大的”,這個時候才適合制作索引~~ 類似于 自增主鍵 ,這種就比較時適合做索引,類似于“性別”這樣的列就不合適做索引 ,因為要么男,要么女,區分度很小,非常不適合做索引

滿足以上條件時,考慮對表中的這些欄位創建索引,以提高查詢效率,

反之, 如果非條件查詢列,或經常做插入、修改操作,或磁盤空間不足時,不考慮創建索引,


1.4 使用

創建主鍵約束(PRIMARY KEY)、唯一約束(UNIQUE)、外鍵約束(FOREIGN KEY)時,會自動創建對應列的索引,

  • 查看索引

show index from 表名;

案例:查看學生表已有的索引

show index from student;

  • 創建索引

    對于非主鍵、非唯一約束、非外鍵的欄位,可以創建普通索引

create index 索引名 on 表名(欄位名);

案例:創建班級表中,name欄位的索引

create index idx_classes_name on classes(name);

  • 洗掉索引

drop index 索引名 on 表名;

案例:洗掉班級表中name欄位的索引

drop index idx_classes_name on classes;

其實上面這些沒有太多好講的,我們來看一個其他的知識點


聚簇索引 和 非聚簇索引

主要描述是mysql底層是如何組織資料的

  • 聚簇索引: 資料本身就是通過B+樹的方式來組織的,比如B+樹的每一個葉子節點存一個完整的記錄就是聚簇索引
    在這里插入圖片描述

  • 非聚簇索引: 先通過 一個"表”這樣的結構,把所有的資料都裝進去~
    在這里插入圖片描述
    然后我們B+樹還存在只是這個時候不存全部資料了,而是存行號,我們通過B+樹,1 這條記錄在表中的行號對應的是 王五 清華大學 這個條資料,這就叫做非聚簇索引
    在這里插入圖片描述
    這個兩種索引,不能說誰好誰壞,只能說看應用的場景, 一般聚簇索引要更加高效一點,為什么呢,因為非聚簇索引還要查一次表,不過非聚簇索引產生的硬碟垃圾更少~

索引的結構最主要的還是B+樹,但是不是說只有B+樹,MySQL支持多種不同的“存盤引擎”,組織資料使用的資料結構都會存在差異嗎,同時索引結構也會存在差異~


二、事務

2.1 介紹事務

事務其實不僅僅是資料庫中的概念,是屬于計算機中一個非常廣泛的概念,主流資料庫也是都是對事務是有一定的支持的,

我們來舉個事務的列子,倒垃圾:

家里有垃圾桶 ,套一個塑料袋,垃圾往袋子里面丟,垃圾滿了就可以把這個袋子一拎,就可以丟了,我們的每一步是有程序的

  1. 把裝滿的袋子拎出來
  2. 再套一個新袋子

這兩步我們應該一氣呵成,這樣方便我們接下來的使用, 我們把多個動作,打包成為一個整體的操作,就稱為事務!

上面的這樣的操作其實沒有一起完成沒有關系,我們來看一下下面一個 銀行轉賬:

如果這個操作沒有一起,那么會產生尷尬的情況!這樣的打包一起也是事務!


事務特點有下面3個情況:

1.原子性

事務最核心的特點,就是把一系列操作打包在一起 ,構成一個整體,這個整體,要么全部完成,要么一個不做,不會出現“做了一半,另一半沒有做的情況”,這個情況稱為 原子性

思考:這個原子性是如何保證的呢???

A轉賬B 500

  1. A的賬戶減500
  2. B的賬戶加500

如果我們在轉賬執行第1步成功了,開始執行第二步的時候,資料庫 或者程式崩潰那么怎么辦呢?

其實我們這里有個叫做回滾(rollback)的一個機制,就是要么一樣不做,指的不是說真的沒做,而是把做了的中間狀態,給偷偷還原回去了, 回滾針對每個進行的操作,都記住干啥了~保證不會出現中間狀態,

2 .一致性

執行事務之前,和 執行事務之后,當前表里面的資料都是合理的狀態~~ 比如不可以出現-400這樣的數字

3.持久性

事務操作的資料都是直接操作硬碟,硬碟的資料都是持久化存盤的.(資料只要改了,那么就會一直存在,就不會說重啟了就沒了)

4.隔離性

一個事務的執行不能被其他的事務執行,即一個事務的內部操作及使用的資料對其他并發事務是隔離的,并發執行的各個事務之間不能互相干擾,

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

標籤:其他

上一篇:【資料結構】計算機底層是用什么識別算數運算式的?

下一篇:docker 容器資料卷volume

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